Bash脚本中的Sed - 替换可变内容的错误原因

时间:2013-10-09 22:30:07

标签: linux bash sed webdav

我有一个Bash脚本:

var="
<Location /webdav/vendor1>
 DAV On
 AuthType Digest
 AuthName "rw"
 AuthUserFile /etc/password/digest-password
 Require user test123456
</Location>

<Location /webdav/limited/vendor1/demo>
 Dav On
 AuthType Digest
 AuthName "ro"
 AuthUserFile /etc/password/digest-password-test2
<LimitExcept GET HEAD OPTIONS PROPFIND>
deny from all 
</LimitExcept>
</Location>
"

sed -i -e "s/somestringX/${var}/g" change.txt

返回错误:sed:-e expression#1,char 9:unterminated`s s命令

当$ var是一些没有像/“'&lt;&gt;这样的特殊符号的单行/多行字符串时,一切正常。

我猜问题是我的$ var的内容,但我不知道该怎么做才能使它工作。

这可能是什么解决方案?

3 个答案:

答案 0 :(得分:7)

Sed也可以使用任何字符作为“s”命令的分隔符。基本上,sed将“s”后面的任何内容作为分隔符。因此,您可以将命令更改为:

sed -i -e "s_somestringX_${var}_g" change.txt

您需要确保分隔符不是目标变量的一部分。

答案 1 :(得分:2)

您应该使用转义斜杠替换所有斜杠,即\/。这对大多数文本都有用。但是,如果您的文字包含&,也可以将其删除。任何反斜杠也必须转义为\\

由于您的文字似乎不包含任何&符号或反斜杠,因此应执行以下操作:

sed -i -e "s/somestringX/${var//\//\\\/}/g" change.txt

这似乎相当复杂,但我们只是将/替换为\/。 Bash可以使用${string//substring/replacement}执行此操作,但我们必须转义斜杠反斜杠。

答案 2 :(得分:2)

您可以尝试awk

awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt

这里唯一的区别是它不会像change.txt sed选项那样修改-i文件。它会将结果重定向到newfile.txt

或者如果你想和sed -i

做同样的事情
awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt && mv newfile.txt change.txt