如何匹配sed中的单引号

gri*_*igy 34 bash shell escaping

如果表达式用单引号括起来,如何匹配sed中的单引号:

sed -e '...'
Run Code Online (Sandbox Code Playgroud)

例如需要匹配此文本:

'foo'
Run Code Online (Sandbox Code Playgroud)

tzo*_*zot 46

你可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)
Run Code Online (Sandbox Code Playgroud)

要么

'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE)
Run Code Online (Sandbox Code Playgroud)

我使用了unicode字符名称.REVERSE SOLIDUS通常被称为反斜杠.

在后一种情况下,你关闭你的撇号,然后用反斜杠引用你的撇号,然后为文本的其余部分打开另一个撇号.

  • 第二种情况是我在寻找的.谢谢. (6认同)

Tim*_*imB 37

正如对问题的评论中所指出的,它并不是关于sed,而是如何在shell中的引用字符串中包含引号(例如bash).

为了澄清先前的答案,您需要使用反斜杠转义引号,但不能在单引号表达式中执行此操作.从bash手册页:

用单引号括起字符可以保留引号中每个字符的字面值.单引号之间可能不会出现单引号,即使前面有反斜杠也是如此.

因此,您需要终止引用的表达式,插入转义的引用,并启动新的引用表达式.shell的引用删除不会添加任何额外的空格,所以实际上你会得到字符串连接.

那么,为了回答如何单引用表达式'foo'的原始问题,你会做这样的事情:

sed -e '...'\''foo'\''...'
Run Code Online (Sandbox Code Playgroud)

(其中'...'是sed表达式的其余部分).

总的来说,为了便于阅读,如果可能的话,你最好将周围的引号更改为双引号:

sed -e "...'foo'..."
Run Code Online (Sandbox Code Playgroud)

[作为第一个(单引号)方法的潜在维护噩梦的一个例子,请注意StackOverflow的语法如何突出显示引号,反斜杠和其他文本的颜色 - 这绝对不正确.