我有一个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的内容,但我不知道该怎么做才能使它工作。
这可能是什么解决方案?
答案 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