3

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

当 $var 是一些单行/多行字符串,没有像 /"'<> 这样的特殊符号时,一切正常。

我想问题出在我的 $var 的内容上,但我不知道该怎么做才能让它工作。

这可能是什么解决方案?

4

3 回答 3

7

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

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

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

于 2013-10-09T22:58:20.250 回答
2

你可以试试awk

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

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

或者如果你想做同样的事情sed -i

awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt && mv newfile.txt change.txt
于 2013-10-09T23:59:21.297 回答
2

您应该用转义斜杠替换所有斜杠,即\/. 这适用于大多数文本。但是,如果您的文本将包含&,则也将其转义。任何反斜杠也必须被转义,因为\\

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

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

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

于 2013-10-09T22:50:15.410 回答