如何匹配sed中的单引号

Posted

技术标签:

【中文标题】如何匹配sed中的单引号【英文标题】:How to match a single quote in sed 【发布时间】:2010-09-10 14:31:09 【问题描述】:

如果表达式用单引号括起来,:

sed -e '...'

例如需要匹配这个文本:

'foo'

【问题讨论】:

标签 [sed] 或多或少不正确,因为问题可能是关于例如awk 内容没有任何变化。它应该是“shell”,但我无法重新标记。 @TimB:shell-quoting 是一个全新的标签,而且多余,因为“shell”、“escaping”绰绰有余。 “转义”已经使用了几十年(将近 40 年),当时人们将字符从它们在 shell 中的特殊含义中剥离出来......问题是关于转义引号。 【参考方案1】:

您可以使用:

"texta'textb" (APOSTROPHE inside QUOTATION MARKs)

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

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

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

【讨论】:

第二种情况是我要找的。谢谢。【参考方案2】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

精彩的深入解释,谢谢【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

...wut. 如果您已经使用双引号,则永远不需要['],因为您已经可以按原样嵌入';如果你是单引号,你也不能使用。因此,您永远不需要[']。这个答案不如我们的缅因浣熊吐在地板上的毛球有用。

以上是关于如何匹配sed中的单引号的主要内容,如果未能解决你的问题,请参考以下文章

如何使用`sed`替换用双引号括住目录的单引号

Sed命令忽略Groovy脚本中的单引号

sed 批量修改文件中遇到的单引号和双引号的坑

如何在sed中使用变量

Shell中的单引号(‘)双引号(”)和反引号(·)

sed字符串替换