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


76

据我发现,当您使用单引号时,其中的所有内容均视为文字。我想要那个代替我。但我也想找到一个带有单引号或双引号的字符串。

例如,

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吗?

\实际是否将单引号内的字符转义?

Answers:


104

中的s///命令sed允许您使用其他字符代替/定界符,如

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

要么

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

双引号不是问题。要匹配单引号,请切换两种类型的引号。请注意,单引号字符串不能包含单引号(甚至不包含转义的单引号)。

如果sed要将点解释为文字点,而不是将其解释为.与任何一个字符匹配的正则表达式模式,则需要转义这些点。


很好的答案,我只是有一个简短的问题。我将如何用单引号代替双打。我的代码中有一些实例,该实例是单例还是双例,我可以只运行两次此命令,但是转义单引号的语法是什么?
KRB

转义单引号对我不起作用(在Mac上为bash),但使用不同的引号类型来包装命令而不是被替换的引号起作用。例如:用或'`sed 's/"/bla/g'代替"blased "s/'/bla/g" to replace bla
rrr

1
@rrr用单引号引起来的字符串不能包含嵌入式单引号。更改外部引号(并转义shell现在可能对解释感兴趣的任何特殊字符)是解决该问题的一种方法。另一个方法是中断单引号的字符串,并用"'"(双引号的单引号)将字符串连接起来,然后再继续单引号的字符串的其余部分,如中所示'you'"'"'d better do that'
库桑兰达

28

关于单引号,请参阅下面用来替换字符串代码let'slet us

命令:

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

结果:

你好,我们走吧


13

很难在单引号内转义一个单引号。试试这个:

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

13

我的问题是我需要""在表达式的外部,因为我在sed表达式本身内部有一个动态变量。因此,比实际的解决方案更重要的是,您可以使用lenn jackman"的sed regex内部替换[\"]

所以我的完整bash是:

RELEASE_VERSION="0.6.6"

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

这是:

# 是sed分隔符

[\"] = "在正则表达式中

值= \"tags/$RELEASE_VERSION\" =我的替换字符串,重要的是它只包含\"引号


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)

该脚本将添加整行(如果没有的话),或者仅用文本加上$ i的值替换(使用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:我在多行代码中写出了上面的脚本以使注释可解析,但我将其用作命令行中的单行代码,如下所示:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi

1

另外:包含BASH变量的sed表达式需要加双"引号(),以正确解释该变量。

如果对$ BASH变量加双引号(建议做法)

...然后您可以对变量双引号进行转义,如下所示:

sed -i "s/foo/bar ""$VARIABLE""/g" <file>

即,更换$变量相关"""

"$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是-或-引用):

$ 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!

... 等等 ...

结论

作为标准做法,我的建议是

  • "-quote BASH变量("$VAR"
  • "-quote,再次声明那些变量(""$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!


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%

只需在“(双引号)之前使用(反斜杠)即可。并使用-i选项
SachinH

1
尽管此代码段是受欢迎的,并且可以提供一些帮助,但是如果它包含有关如何解决该问题的说明,则将大大改善。否则,您的答案的教育价值就会大大降低-请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加说明,并指出适用的限制和假设。
Toby Speight

0

您可以使用 %

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.