从我所能找到的,当你使用单引号时,内部的所有内容都被视为文字。我想要替换它。但我也希望找到一个包含单引号或双引号的字符串。
例如,
sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'
我想用URL_FUBAR替换“http://www.fubar.com”。如何识别我的//或我的双引号?
感谢您的帮助!
编辑:我可以使用s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g
吗?
实际上是否在单引号内转义字符?
答案 0 :(得分:78)
sed
命令允许您使用其他字符而不是/
作为其s
命令中的分隔符:
sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串可能不包含单引号(甚至不包含转义字符串)。
如果sed
将它们解释为点而不是与任何一个字符匹配的正则表达式模式.
,则需要转义这些点。
答案 1 :(得分:23)
关于单引号,请参阅下面用于将字符串let's
替换为let us
的代码:
命令:
echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
结果:
你好,我们走吧
答案 2 :(得分:11)
单引号内的单引号难以逃脱。试试这个:
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
答案 3 :(得分:9)
我的问题是我需要在表达式之外使用""
,因为我在sed表达式本身内部有一个动态变量。因此实际解决方案是来自lenn jackman的那个,你用"
替换sed正则表达式中的[\"]
。
所以我的完整打击是:
RELEASE_VERSION="0.6.6"
sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
这是:
#
是sed分隔符
[\"]
= "
value = \"tags/$RELEASE_VERSION\"
=我的替换字符串,重要的是它只有引号的\"
答案 4 :(得分:1)
在sed中绝对需要转义双引号:例如,如果你在整个sed表达式中使用双引号(当你想要使用shell变量时需要这样做)。
这是一个触及在sed中转义的示例,但也在bash中捕获了一些其他引用问题:
# cat inventory
PURCHASED="2014-09-01"
SITE="Atlanta"
LOCATION="Room 154"
假设您想要使用可以反复使用的sed脚本来更改房间,因此您可以按如下方式对输入进行变换:
# i="Room 101" (these quotes are there so the variable can contains spaces)
如果不存在,该脚本将添加整行,或者它将简单地替换(使用sed)那里的行与文本加上$ i的值。
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
P.S。我在多行上写了上面的脚本,使注释可以解析,但我在命令行中使用它作为一行,如下所示:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi
答案 5 :(得分:0)
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%
答案 6 :(得分:0)
此外:包含BASH变量的sed表达式需要用双引号("
)引用,以正确解释该变量。
如果您还也将$ BASH变量双引号(建议做法)
...然后您可以对变量双引号进行转义,如下所示:
sed -i "s/foo/bar ""$VARIABLE""/g" <file>
即,将与$ VARIABLE相关的"
替换为""
。
(将"$VAR"
换为\"$VAR\"
会导致"
引用的输出字符串。)
示例
$ VAR='apples and bananas'
$ echo $VAR
apples and bananas
$ echo "$VAR"
apples and bananas
$ printf 'I like %s!\n' $VAR
I like apples!
I like and!
I like bananas!
$ printf 'I like %s!\n' "$VAR"
I like apples and bananas!
在这里,$ VAR在用管道连接到sed之前用"
引号(用sed用'
或"
引号):
$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!
$ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
I like apples and bananas!
$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!
$ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
I like apples and bananas!
$ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
I like cherries!
$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!
将其与以下内容进行比较:
$ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
I like apples!
I like and!
I like bananas!
$ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
I like apples!
I like and!
I like bananas!
...等等...
结论
作为标准做法,我的建议是
"
-引用BASH变量("$VAR"
)"
-引号, ,如果这些变量(""$VAR""
用在sed表达式中(其本身必须用"
引号), '
中未引用)$ VAR='apples and bananas'
$ echo "$VAR"
apples and bananas
$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!
答案 7 :(得分:0)
您可以使用%
sed -i "s%http://www.fubar.com%URL_FUBAR%g"
答案 8 :(得分:-4)
你需要使用\“for escaping”字符(\ escape下面的字符
sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'
答案 9 :(得分:-5)
可能是“\”字符,试试这个:
sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'