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'