43

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

sed -e '...'

例如需要匹配这个文本:

'foo'
4

4 回答 4

54

您可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

或者

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

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

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

于 2008-09-18T09:24:12.817 回答
46

正如对问题的评论中所指出的,这实际上与 sed 无关,而是如何在 shell(例如 bash)的带引号的字符串中包含引号。

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

将字符括在单引号中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

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

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

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

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

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

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

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

于 2008-10-16T00:05:12.603 回答
1

对于sed,一个很简单的解决办法就是把单引号格式改成双引号。

对于包含单引号的给定变量

var="I'm a string with a single quote"

如果双引号用于 sed,这将匹配单引号。

echo $var | sed "s/'//g"
Im a string with a single quote

而不是单引号,这会挂起

echo $var | sed 's/'//g'
于 2020-12-03T19:55:51.857 回答
-1

您还可以使用[']来匹配文字单引号,而无需执行任何 shell 引用技巧。

myvar="stupid computers can't reason about life"
echo "$myvar" | sed -e "s/[']t//"
输出:
stupid computers can reason about life
于 2020-07-31T14:03:48.827 回答