替换命令无法正常工作。

3

我想要替换这段代码

 for($counter=0;$counter<10;$counter++)
 {
     $yyarr[$counter]=$counter+2004;
 }

使用

 for($counter=2004;$counter<=date("Y");$counter++)
 {
     $yyarr[$counter-2004]=$counter;
 }

我正在使用

sed -e 's/for\(\$counter=0;\$counter<10;\$counter++\)\n\t+{\n\t+\$yyarr\[\$counter\]=\$counter+2004;\n\t+}/for\(\$counter=2004;\$counter<=date\("Y"\);\$counter++\)\n{\$yyarr\[\$counter-2004\]=\$counter;\n}/g'

但是无法通过。末尾空格需要被忽略。


我认为sed不能处理多行正则表达式。可能有一些版本可以,但这并不是我的经验。对于这样的情况,我建议使用perl -p -i -e而不是sed - Tim Pierce
2个回答

2
sed ':a;N;$!ba;s/for($counter=0;$counter<10;$counter++)\n{\n    $yyarr\[$counter\]=$counter+2004;\n}/for($counter=2004;$counter<=date("Y");$counter++)\n{\n    $yyarr\[$counter-2004\]=$counter;\n}/g' file

您遇到了换行符 \n 的问题。上述代码将解决此问题。


1

sed 处理数据行。因此,您尝试搜索/替换模式的方式不起作用。您可以利用保留空间来搜索您的模式。

以下内容可能适合您:

sed -n '1h; 1!H; ${g; s/\s*for(\$counter=0;\$counter<10;\$counter++)\s*\n\s*{\s*\n\s*\$yyarr\[\$counter\]=\$counter+2004;\s*\n}/\nfor($counter=2004;$counter<=date("Y");$counter++)\n{\n\t$yyarr[$counter-2004]=$counter;\n}/ p}' filename

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接