我需要将一些非常复杂的序列替换为loto文件:
例如,我需要替换:
<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我在char 28上得到了一个"unterminated %s“命令错误
我已经避开了“using \”。
我已经读了很多关于下水道的书,但都没有符合我的问题。一些想法?
提前谢谢你。
发布于 2014-09-17 05:22:39
您只需要为替换命令使用不同的分隔符。例如,使用竖线:
sed -e "s|$mod5|$mod6|"只要在mod5或mod6中都不出现竖条,这种方法就能正常工作。如果是,请选择另一个字符作为分隔符。另一个流行的选择是at-sign:
sed -e "s@$mod5@$mod6@"或者,可以使用传统的/分隔符,但在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表达式#1,char 5:未终止的s' command $ a="a b"; echo c | sed "s/c/'"$a"'/" sed: -e expression #1, char 6: unterminateds‘/'中的单引号字符和上面的'/都包含在双引号中,它们被视为将放在输出中的文字字符。例如:
$ echo hello | sed "s/l/''/g“he‘o
https://stackoverflow.com/questions/25878191
复制相似问题