首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed对复杂文本进行转义

使用sed对复杂文本进行转义
EN

Stack Overflow用户
提问于 2014-09-17 04:50:11
回答 1查看 66关注 0票数 2

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

例如,我需要替换:

代码语言:javascript
复制
<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">

通过以下方式:

代码语言:javascript
复制
<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脚本中使用了两个变量,这两个变量可以做很多其他的事情:

代码语言:javascript
复制
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\">"

实际上,我尝试过很多不同的命令:

代码语言:javascript
复制
sed -e"s/"$mod5"/'"$mod6"'/" $i.mod3 > $i

我在char 28上得到了一个"unterminated %s“命令错误

我已经避开了“using \”。

我已经读了很多关于下水道的书,但都没有符合我的问题。一些想法?

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2014-09-17 05:22:39

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

代码语言:javascript
复制
sed -e "s|$mod5|$mod6|"

只要在mod5mod6中都不出现竖条,这种方法就能正常工作。如果是,请选择另一个字符作为分隔符。另一个流行的选择是at-sign:

代码语言:javascript
复制
sed -e "s@$mod5@$mod6@"

或者,可以使用传统的/分隔符,但在mod5mod6中使用反划线来避开所有出现的/。但是,这种方法需要注意,因为在将结果传递到sed之前,shell将为自己的目的处理转义。

外壳和引用

考虑一下:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25878191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档