R******d 发帖数: 1436 | 1 文件中有一段需要换成新提供的内容,请问用shell/perl怎么操作?谢谢了。
举个例子,需要被替换的内容如下:
{
logic_name => 'mask',
batch_size => 10,
resource => 'rusage[myens_build1tok=11]',
memory => ['500k', '1k', '3k'],
retries => 0,
},
想要替换成的内容如下:
{
logic_name => 'mask',
batch_size => 100,
resource => 'rusage[myens_build1tok=10]',
memory => ['500MB', '1GB', '3GB'],
retries => 3,
retry_resource => 'rusage[myens_build1tok=10]',
},
需要被替换的内容通过下面的脚本从文件中提取:
a=`awk '{if($0~/{/){x="";do{x=x"n"$0}while(getline&&!/},/)};if (x~/logic_
name/&&x~/mask/){print x"n"$0|"awk 'NF'"};x=$0}' file`
想要替换的内容可以先放到一个变量里去:
b=`{
logic_name => 'mask',
batch_size => 100,
resource => 'rusage[myens_build1tok=10]',
memory => ['500MB', '1GB', '3GB'],
retries => 3,
retry_resource => 'rusage[myens_build1tok=10]',
},`
剩下的就是替换了,试了下awk,好像不成功,大概因为内容里有特殊字符'等。 | R******d 发帖数: 1436 | 2 bash+perl混合的捣鼓出来了,比较猥琐。
有没有可能awk和sed直接搞定?
export a=`awk '{if($0~/{/){x="";do{x=x"\n"$0}while(getline&&!/},/)};if (x~/
logic_name/&&x~/mask/){print x"\n"$0|"awk 'NF'"};x=$0}' file`
export b=`echo "{
logic_name => 'mask',
batch_size => 100,
resource => 'rusage[myens_build1tok=10]',
memory => ['500MB', '1GB', '3GB'],
retries => 3,
retry_resource => 'rusage[myens_build1tok=10]',
},"`
perl -e 'while (<>){$x.=$_}END{$x=~s/\Q$ENV{'a'}/$ENV{'b'}/;print "$x\n"}'
file |
|