我需要将一些非常复杂的序列替换成一堆文件:
例如,我需要更换:
<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|"
只要mod5
或mod6
中都没有出现竖条,这种方法就可以很好地工作。如果是,请选择另一个字符作为分隔符。另一个受欢迎的选择是标志:
sed -e "s@$mod5@$mod6@"
可替换地,可以使用传统的/
定界符,但是用backlash避开mod5
和mod6
中的所有/
的出现。然而,这种方法需要小心,因为在将结果传递到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