Xml 使用sed进行复杂文本转义
我需要将一些非常复杂的序列替换为一堆文件: 例如,我需要更换:Xml 使用sed进行复杂文本转义,xml,sed,escaping,Xml,Sed,Escaping,我需要将一些非常复杂的序列替换为一堆文件: 例如,我需要更换: <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"> 我在字符28上有一个“unterminated`s'command”错误 我已经逃过了“使用\” 我
<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">
我在字符28上有一个“unterminated`s'command”错误
我已经逃过了“使用\”
我已经读了很多Answer,但没有一本与我的问题相匹配。
一些想法
提前感谢。您只需要为替换命令使用不同的分隔符。例如,使用垂直条:
sed -e "s|$mod5|$mod6|"
只要竖条不出现在mod5
或mod6
中,该功能就可以正常工作。如果是,请选择另一个字符作为分隔符。另一个流行的选择是at标志:
sed -e "s@$mod5@$mod6@"
或者,可以使用传统的/
分隔符,但在mod5
和mod6
中使用反斜杠来避免所有出现的/
。但是,这种方法需要小心,因为shell在将结果传递到sed
之前,会出于自己的目的处理转义
壳与引用
考虑:
sed -e"s/"$mod5"/'"$mod6"'/"
在上文中,s/
、/'
和'/
都在双引号中,但$mod5
和$mod6
都在任何引号之外。这导致了两个问题:
- 由于
和$mod5
不在任何引号内,因此shell将对这两个词进行分词。这让sed陷入了无望的困惑。因此,shell变量几乎应该总是在双引号内。举例来说,以下第一个示例有效,后两个示例无效:$mod6
$ 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
sed -e"s/"$mod5"/'"$mod6"'/"
$ 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