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

Linux Bash脚本中的Sed-替换变量内容的错误原因,linux,bash,sed,webdav,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

我有一个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
var=”
达文
AuthType摘要
AuthName“rw”
AuthUserFile/etc/password/digest password
需要用户测试123456
达文
AuthType摘要
AuthName“ro”
AuthUserFile/etc/password/digest-password-test2
全盘否定
"
sed-i-e“s/somestringX/${var}/g”change.txt
返回错误:sed:-e表达式#1,char 9:unterminated`s'命令

当$var是没有特殊符号(如/“')的单行/多行字符串时,一切正常

我想问题在于我的$var的内容,但我不知道如何才能使它工作


解决这个问题的方法是什么?

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

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

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

这似乎相当复杂,但我们只是用
\/
替换
/
。Bash可以用
${string//substring/replacement}
来完成这项工作,但我们必须转义斜杠和反斜杠。

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

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

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

您可以尝试
awk

awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt
这里唯一的区别是它不会像
sed
使用
-i
选项那样修改
change.txt
文件。它会将结果重定向到
newfile.txt

或者如果您想执行与sed-i相同的操作

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

谢谢,这是有效的,尽管我不得不稍微更改$var以使其有效。谢谢因此,工作脚本如下所示:
#/bin/bash var=“\n\nDAV On\nAuthType Digest\nAuthName“rw”\nAuthUserFile/etc/password/Digest password\n请求用户测试123456\n\n\n\nDAV On\nAuthType Digest\nAuthName“ro”\nAuthUserFile/etc/password/Digest-password-password-test2\n\n\n\n来自所有\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n