在Bash脚本中的Sed – replacevariables内容的错误原因

我有一个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:-eexpression式#1,字符9:未终止的's'命令

当$ var是一些单/多行string没有像/“'<>特殊标志,一切工作正常。

我想这个问题是与我的$ var的内容,但我不知道该怎么做才能使其工作。

有什么可以解决这个问题?

Sed也可以使用任何字符作为“s”命令的分隔符。 基本上,sed采取任何“s”之后的分隔符。 所以你可以把你的命令改成:

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

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

你应该用斜杠来替换所有的斜杠,作为\/ 。 这对大多数文本都适用。 如果你的文本将包含& ,也可以跳过这个。 任何反斜杠也不得不逃脱

由于您的文本似乎没有包含任何&符号或反斜杠,因此应该这样做:

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

这似乎相当复杂,但我们只是用\/替换\/ 。 Bash可以用${string//substring/replacement}来做到这一点,但是我们必须避开斜杠反斜杠。

你可以试试awk

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

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

或者如果你想像sed -i一样做

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