如何匹配sed中的单引号

时间:2020-03-06 14:20:28  来源:igfitidea点击:

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

sed -e '...'

例如需要匹配此文本:

'foo'

解决方案

我们可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

或者

'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"单引号的原始问题,我们可以执行以下操作:

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

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

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

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

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