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
    $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
    

这是一样的:(sed-e“s!”$mod5!“$mod6”!g“$i.mod3>$i@TitusI正如你所写的,它不会起作用,因为引用是不正确的。请按照我的回答使用引用。@TitusI我刚刚添加了一些关于shell引用的讨论。
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