用sed替换多行变量

时间:2013-04-21 17:22:31

标签: linux bash sed replace

我必须创建一个脚本来替换apache的httpd.conf文件中的几行。我有2个问题。首先,我如何将多行保存到单个变量中?我尝试了这个,但它没有用

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,char 54:未终止的's'命令

1 个答案:

答案 0 :(得分:1)

从我在这里看到的问题是,你没有正确地逃避变量赋值中的双引号和sed one-liner。

问题1

如果有以下内容,您必须转义引号:

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

问题2

你的sed行中也需要转义引号:

例如:

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