2013-11-27 558 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