SED中如何避免双引号和单引号? (bash)的

根据我所能find的,当你使用单引号时,里面的所有内容都被认为是文字。 我想要replace。 但是我也想find一个有单引号或双引号的string。

例如,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g' 

我想用URL_FUBAR取代“http://www.fubar.com”。 sed应该如何识别我的/或我的双引号?

谢谢你的帮助!

编辑:我可以用s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g吗?

\实际上是否在单引号内转义字符?

sed命令允许您使用其他字符而不是/

 sed 's#"http://www.fubar.com"#URL_FUBAR#g' 

双引号不是问题。

关于单引号,看下面的代码用来代替stringlet's let us

命令:

 echo "hello, let's go"|sed 's/let'"'"'s/let us/g' 

结果:

你好,让我们走吧

在单引号内很难避免单引号。 尝试这个:

 sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g" 

例:

 $ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END this is "http://www.fubar.com" and 'http://www.example.com' here END 

产生

 this is URL_FUBAR and URL_EXAMPLE here 

我的问题是我需要在expression式之外有"" ,因为我在sedexpression式本身中有一个dynamicvariables。 所以比实际的解决scheme是从lenn jackman,你取代了"内部的sed正则expression式[\"]

所以我完整的bash是:

 RELEASE_VERSION="0.6.6" sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml 

这是:

#是sed分隔符

[\"] = "在正则expression式

值= \"tags/$RELEASE_VERSION\" =我的replacestring,重要的是只有\"为引号

在sed中,转义双引号是绝对必要的:例如,如果在整个sedexpression式中使用双引号(因为您需要使用shellvariables)。

下面是一个涉及sed中的转义的例子,但也捕获了bash中的其他引用问题:

 # cat inventory PURCHASED="2014-09-01" SITE="Atlanta" LOCATION="Room 154" 

假设你想用一个可以一遍又一遍地使用的sed脚本来改变房间,所以你可以按如下方式改变input:

 # i="Room 101" (these quotes are there so the variable can contains spaces) 

如果脚本不存在,这个脚本将会添加整行,或者只是用文本加上$ i的值来replace(使用sed)那行。

 if grep -q LOCATION inventory; then ## The sed expression is double quoted to allow for variable expansion; ## the literal quotes are both escaped with \ sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory ## Note the three layers of quotes to get echo to expand the variable ## AND insert the literal quotes else echo LOCATION='"'$i'"' >> inventory fi 

PS我写了多行上面的脚本,使评论可以parsing,但我使用它作为一个命令行上的一行,看起来像这样:

 i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi 
 Prompt% cat t1 This is "Unix" This is "Unix sed" Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1 Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1 Prompt% cat t1 This is "Linux" This is "Linux SED" Prompt% 

你需要使用“转义”字符(\转义下面的字符

 sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g' 

可能是“\”字符,试试这个:

 sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'