如果表达式用单引号括起来,如何匹配 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 通常被称为反斜杠。
在后一种情况下,您关闭撇号,然后用反斜杠对撇号进行壳引用,然后为其余文本打开另一个撇号。
正如对问题的评论中所指出的,这实际上与 sed 无关,而是如何在 shell(例如 bash)的带引号的字符串中包含引号。
为了澄清先前的答案,您需要使用反斜杠转义引号,但您不能在单引号表达式中执行此操作。从 bash 手册页:
将字符括在单引号中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。
因此,您需要终止带引号的表达式,插入转义的引号,并开始一个新的带引号的表达式。shell 的引号删除不会添加任何额外的空格,因此实际上您得到了字符串连接。
因此,要回答如何单引号表达式 'foo' 的原始问题,您可以执行以下操作:
sed -e '...'\''foo'\''...'
(其中 '...' 是 sed 表达式的其余部分)。
总的来说,为了便于阅读,如果可能的话,最好将周围的引号更改为双引号:
sed -e "...'foo'..."
[作为第一种(单引号)方法的潜在维护噩梦的示例,请注意 StackOverflow 的语法如何突出显示引号、反斜杠和其他文本的颜色——这绝对是不正确的。]
对于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'
您还可以使用[']
来匹配文字单引号,而无需执行任何 shell 引用技巧。
myvar="stupid computers can't reason about life"
echo "$myvar" | sed -e "s/[']t//"
输出:
stupid computers can reason about life