2014-01-02 3 views
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' 

Но не может получить его до конца. Недопустимое прокручивание пробелов должно быть проигнорировано.

+0

Я не думаю, что СЭД будет обрабатывать регулярные выражения многоканальных. Могут быть некоторые версии, которые делают, но не в моем опыте. Я бы рекомендовал нечто вроде 'perl -p -i -e' вместо' sed' для чего-то вроде этого. –

ответ

1

sed обрабатывает линии данных. Таким образом, способ, которым вы пытаетесь выполнить поиск/замену шаблона, не будет работать. Тем не менее, вы можете использовать hold space.

Следующие может работать для вас:

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 
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. Вышеупомянутый код исправит его.

Смежные вопросы