2013-11-27 557 views
1

让我来解释一下我面临的场景:我有一个perl文件,它可以创建另一个进程使用的'header'字符串。这在perl脚本(script.pl)定义:如何在使用sed的字符串替换时添加字面换行符?

$str = "START\n" . 
"PARAM1=blah\n" . 
"PARAM2=blah2\n" . 
"PARAM3=blah3\n"; 

我需要通过一个bash脚本追加更多的值修改为$ str中的值,所以我想我会用SED。这是我到目前为止有:

str_new="\"NEWPARAM1=blah\" .\n\"NEWPARAM2=blah2\" .\n"; 
sed -i "/START/{n;s/^/$str_new/}" script.pl 

这种类型的作品,就是我得到的是:

$str = "START\n" . 
     "NEWPARAM1=blah" . 
     "NEWPARAM2=blah2" . 
     "PARAM1=blah\n" . 
     "PARAM2=blah2\n" . 
     "PARAM3=blah3\n"; 

不过,我需要的是字面“\ n”显示为好新的参数之后,我接着说:

$str = "START\n" . 
     "NEWPARAM1=blah\n" . 
     "NEWPARAM2=blah2\n" . 
     "PARAM1=blah\n" . 
     "PARAM2=blah2\n" . 
     "PARAM3=blah3\n"; 

我一直在使用“\ n”试过了,\ n的sed的替代条款,但没有运气。任何帮助,将不胜感激

+0

这是什么语言?这不是'sh'或'bash'。 –

+0

对不起,忘了提及我在bash脚本中使用这个 –

+0

是的,我得到的是 $ str =“START \ n”。 “NEWPARAM1 = blah ”。 “NEWPARAM2 = blah2 ”。 等。因为格式化被搞砸了,它所做的是将\\ n解释为另一个换行符,所以它在blah后面添加一个换行符,然后在'。'后面添加另一个换行符。 –

回答

1

使用方法如下:

str_new='"NEWPARAM1=blah\\n" .\n"NEWPARAM2=blah2\\n" .\n' 
sed -i.bak "/START/{n;s/^/$str_new/;}" script.pl 

cat script.pl 
$str = "START\n" . 
"NEWPARAM1=blah\n" . 
"NEWPARAM2=blah2\n" . 
"PARAM1=blah\n" . 
"PARAM2=blah2\n" . 
"PARAM3=blah3\n"; 
+0

这工作完美!非常感谢 –

+0

不客气,很高兴它为你解决。 – anubhava

+0

只是在您的str_new中使用$,\ 1 - > \ 9和&&,因为有少数RegEx vlaue用于s // – NeronLeVelu

0

我会考虑使用一个定界符在Perl来简化问题:

$str = <<EOT; 
START 
PARAM1=blah 
PARAM2=blah2 
PARAM3=blah3 
EOT