如果表达式括在单引号中,如何在 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 字符名称。REVERSE SOLIDUS 通常称为反斜杠。

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

其他提示

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

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

在单引号中封闭字符可以保留引号中每个字符的字面价值。即使在后斜切之前,也可能不会在单个引号之间出现单个报价。

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top