我需要将一些非常复杂的序列替换成一个文件:
E.g。我需要替换:
<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
使用:
<StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd">
我在bash脚本中使用了两个变量来执行许多其他操作:
mod5="<sld:StyledLayerDescriptor xmlns:sld=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\" version=\"1.0.0\">"
mod6="<StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0.0\" xsi:schemaLocation=\"http://www.opengis.net/sld StyledLayerDescriptor.xsd\">"
我实际上执行了很多不同的命令:
sed -e"s/"$mod5"/'"$mod6"'/" $i.mod3 > $i
我有一个&#34;未终止的'&#39;命令&#34; char 28上的错误
我已经逃脱了&#34;使用\&#34;。
我已经阅读了很多内容,但没有与我的问题相符。 一些想法?
提前谢谢。
答案 0 :(得分:1)
您只需要为替换命令使用不同的分隔符。例如,使用竖线:
sed -e "s|$mod5|$mod6|"
只要垂直条未显示在mod5
或mod6
中,此功能就可以正常运行。如果是,请为分隔符选择另一个字符。另一个受欢迎的选择是签名:
sed -e "s@$mod5@$mod6@"
或者,可以使用传统的/
分隔符,但可以使用反斜杠转义/
和mod5
中出现的所有mod6
。但是,这种方法需要小心,因为shell会在将结果传递给sed
之前为自己的目的处理转义。
考虑:
sed -e"s/"$mod5"/'"$mod6"'/"
在上文中,s/
,/'
和'/
都是双引号,但$mod5
和$mod6
都在任何引号之外。这导致两个问题:
由于$mod5
和$mod6
不在任何引号之内,因此shell会同时进行单词拆分。这使sed
无可救药地混淆了。因此,shell变量应该几乎总是在双引号内。为了说明,下面的第一个例子是有效的,后两个不是:
$ a="a b"; echo c | sed "s/c/$a/"
a b
$ a="a b"; echo c | sed "s/c/"$a"/"
sed: -e expression #1, char 5: unterminated `s' command
$ a="a b"; echo c | sed "s/c/'"$a"'/"
sed: -e expression #1, char 6: unterminated `s' command
由于上面/'
和'/
中的单引号字符都在双引号内,因此它们被视为将放置在输出中的文字字符。例如:
$ echo hello | sed "s/l/''/g"
he''''o