2013-04-21 116 views
2

我必須創建一個腳本來替換apache的httpd.conf文件中的幾行。我有兩個問題。首先,我如何將多行保存到一個變量中?我想這一點,但沒有奏效用sed替換多行變量

replace="#ErrorLog "logs/error_log" '\n' ErrorLog "|<apache_location>/bin/rotatelogs <apache_location>/logs/error.%Y.%m.%d.log 86400" 

'\n'沒有工作添加一個換行符。然後,我的想法是使用SED(1)所示:

sed -i "s#ErrorLog "logs/error_log"#$replace#g" $apache_httpd 

我不知道這是否會奏效。


我能夠創建幾行變量:
VAR="#ErrorLog \"logs/error_log\""
VAR="$VAR"$'\n'"ErrorLog \"|<apache_location>/bin/rotatelogs <apache_location>/logs/error.%Y.%m.%d.log 86400\""

replace="ErrorLog \"logs/error_log\""

現在的問題自帶的sed,我不得不使用不同的分隔符(http://backreference.org/2010/02/20/using-different-delimiters-in-sed/)。但它一直在失敗。
sed -i "s;$replace;$VAR;g" /root/daniel/scripts/test3/httpd.conf
的sed:-e表達式#1,焦炭54:未結束的'S'命令

+3

只是一般般的簡單,但總的原則問題,你會發現任何涉及多行打交道時的sed的基於行的處理可以是一個痛苦的對接。在這些情況下,並且通常在許多其他情況下,您會發現在sel中交換sed可以使這些曾經令人沮喪地複雜的事情變得非常簡單和容易。所以你的Perl行會像'perl -i.orig -ple's/foo/bar/g'somefiles'。 – tchrist 2013-04-21 17:30:23

+0

謝謝,但腳本現在有幾百行:(而且我不想重新啓動 – radicaled 2013-04-21 20:05:26

回答

1

從我看到這裏,你的問題是,你沒有正確地轉義雙引號中的變量賦值和sed單線。

問題1

你必須逃生引號,如果有任何:

kent$ r="foo\n\"bar\"\nbaz" 
kent$ echo $r 
foo 
"bar" 
baz 

問題2

你需要逃生在引號您sed line too:

例如:

kent$ cat file 
keep the lines before 
--- 
foo and "this" 
--- 
keep the following lines 

kent$ sed "s#foo and \"this\"#$r#" file 
keep the lines before 
--- 
foo 
"bar" 
baz 
--- 
keep the following lines