在 sed 的正则表达式中使用交替“|”

在 sed 的正则表达式中使用交替“|”

我正在使用 sed,GNU sed 版本 4.2.1。我想在子表达式中使用交替“|”符号。例如:

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

应该返回

" blib bou "

但它又回来了

"blia blib bou blf".

我怎样才能得到预期的结果?

答案1

“|” 也需要反斜杠才能获得其特殊含义。

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

会做你想做的事。

如您所知,如果其他方法都失败了,请阅读手册 :-)。

GNU sed 用户手册, 部分3.3 正则表达式语法概述

`REGEXP1\|REGEXP2'

匹配 REGEXP1 或 REGEXP2。

注意反斜杠...

不幸的是,正则表达式语法并不是真正标准化的……有许多变体,它们之间的区别在于哪些“特殊字符”需要 \,哪些不需要。在某些情况下,它甚至是可配置的或依赖于开关(例如在 GNU 中grep,您可以在三种不同的正则表达式方言之间切换)。

这个答案特别适用于GNU sed还有其他sed变体,例如 BSD 中使用的变体,其行为有所不同。

答案2

由于有几条关于非 Gnused实现的评论:至少在 OS X 上,您可以使用该-E参数来 sed

将正则表达式解释为扩展(现代)正则表达式,而不是基本正则表达式(BRE)。re_format(7) 手册页完整描述了这两种格式。

然后,你就可以使用正则表达式元字符而无需对其进行转义。例如:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou 

答案3

GNU sed 还支持-r选项(扩展正则表达式)。这意味着您不必转义元字符:

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

输出:

hi hi

答案4

后续:sed -E 在 MacOS 上允许这样做。| 不需要反斜杠。

 sed -E 's/this|orthat/oooo/g' infile

相关内容