使用sed进行复杂文本转义



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

例如,我需要更换:

<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

我在字符28 上有一个"未终止的命令"错误

我逃脱了"使用\"。

我已经读了很多答案,但没有一个能与我的问题相匹配。一些想法?

提前谢谢。

替换命令只需要一个不同的分隔符。例如,使用竖条:

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

只要mod5mod6中都没有出现竖条,这种方法就可以很好地工作。如果是,请选择另一个字符作为分隔符。另一个受欢迎的选择是标志:

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

可替换地,可以使用传统的/定界符,但是用backlash避开mod5mod6中的所有/的出现。然而,这种方法需要小心,因为在将结果传递到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
    

最新更新