使用sed转义的复杂文本

时间:2014-09-16 20:50:11

标签: xml sed escaping

我需要将一些非常复杂的序列替换成一个文件:

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;。

我已经阅读了很多内容,但没有与我的问题相符。 一些想法?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您只需要为替换命令使用不同的分隔符。例如,使用竖线:

sed -e "s|$mod5|$mod6|"

只要垂直条未显示在mod5mod6中,此功能就可以正常运行。如果是,请为分隔符选择另一个字符。另一个受欢迎的选择是签名:

sed -e "s@$mod5@$mod6@"

或者,可以使用传统的/分隔符,但可以使用反斜杠转义/mod5中出现的所有mod6。但是,这种方法需要小心,因为shell会在将结果传递给sed之前为自己的目的处理转义。

shell和引用

考虑:

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