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

KRB*_*KRB 63 bash command-line sed

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

例如,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助!

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

\实际上是否在单引号内逃脱了字符?

Kus*_*nda 88

sed命令允许您/在其s命令中使用其他字符而不是分隔符:

sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'
Run Code Online (Sandbox Code Playgroud)

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

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

  • @rrr 单引号字符串不能包含嵌入的单引号。更改外部引号(并转义 shell 现在可能有兴趣解释的任何特殊字符)是解决此问题的一种方法。另一种方法是打破单引号字符串并用`"'"`(双引号单引号)连接字符串,然后再继续单引号字符串的其余部分,如在 `'you'"'"' 中更好这样做'`。 (2认同)

ton*_*uan 26

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

命令:

echo "hello, let's go"|sed 's/let'"'"'s/let us/g'
Run Code Online (Sandbox Code Playgroud)

结果:

你好,我们走吧

  • 为什么sed's/let \'s/let us/g'不起作用? (11认同)
  • 有一个***更简单的方法可以做到这一点。尝试:`echo“你好,我们走吧”| sed s/let\'s/let us/g`。实际上,您*必须*将“sed”的参数放在单引号中。 (3认同)

gle*_*man 12

单引号内的单引号难以逃脱.试试这个:

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

例:

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

产生

this is URL_FUBAR and URL_EXAMPLE here
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 9

我的问题是我需要""在表达式之外使用,因为我在sed表达式中有一个动态变量.因此实际的解决方案是来自lenn jackman的那个你用"sed正则表达式替换里面的[\"].

所以我完全的打击是:

RELEASE_VERSION="0.6.6"

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml
Run Code Online (Sandbox Code Playgroud)

这是:

# 是sed分隔符

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

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