我有一个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