如何在sed中转义双引号和单引号?

时间:2011-09-22 15:46:38

标签: bash command-line sed

从我所能找到的,当你使用单引号时,内部的所有内容都被视为文字。我想要替换它。但我也希望找到一个包含单引号或双引号的字符串。

例如,

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

我想用URL_FUBAR替换“http://www.fubar.com”。如何识别我的//或我的双引号?

感谢您的帮助!

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

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

10 个答案:

答案 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'