关于bash:如何匹配sed中的单引号

关于bash:如何匹配sed中的单引号

How to match a single quote in sed

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

1
sed -e '...'

例如需要匹配此文本:

1
'foo'


您可以使用:

1
"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

要么

1
'texta'\''textb' (APOSTROPHE text APOSTROPHE, then REVERSE SOLIDUS, APOSTROPHE, then APOSTROPHE more text APOSTROPHE)

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

在后一种情况下,您可以关闭撇号,然后用反斜杠对您的撇号进行shell引用,然后为其余的文本打开另一个撇号。


正如对该问题的评论所指出的那样,它实际上与sed无关,而是如何在外壳程序(例如bash)中用引号引起来的字符串中包含引号。

为了弄清楚先前的答案,您需要在反引号前加上反斜杠,但是不能在单引号中使用引号。从bash手册页:

Enclosing characters in single quotes
preserves the literal value of each
character within the quotes. A single
quote may not occur between single
quotes, even when preceded by a
backslash.

因此,您需要终止带引号的表达式,插入转义的引号,然后启动新的带引号的表达式。 Shell的引号删除不会添加任何额外的空格,因此实际上您会得到字符串连接。

因此,要回答有关如何对表达式" foo"单引号的原始问题,您可以执行以下操作:

1
sed -e '...'\''foo'\''...'

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

总体而言,出于可读性考虑,如果可能的话,最好将周围的引号更改为双引号:

1
sed -e"...'foo'..."

[作为第一种(单引号)方法潜在的维护噩梦的示例,请注意StackOverflow的语法高亮显示了引号,反斜杠和其他文本的颜色-绝对不正确。]


推荐阅读