如何匹配sed中的单引号

时间:2008-09-18 09:12:10

标签: bash shell escaping

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

sed -e '...'

例如需要匹配此文本:

'foo'

4 个答案:

答案 0 :(得分:45)

您可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

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

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

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

答案 1 :(得分:37)

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

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

  

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

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

所以,为了回答如何单引用'foo'这个词的原始问题,你会做这样的事情:

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

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

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

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

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

答案 2 :(得分:0)

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

myvar="stupid computers can't reason about life"
echo "$myvar" | sed -e "s/[']t//"
输出:
stupid computers can reason about life

答案 3 :(得分:0)

对于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'