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

Ced*_*ric 85 regex sed

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

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'
Run Code Online (Sandbox Code Playgroud)

应该回来

" blib bou "
Run Code Online (Sandbox Code Playgroud)

但它返回

"blia blib bou blf".
Run Code Online (Sandbox Code Playgroud)

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

sle*_*ske 112

“|” 还需要一个反斜杠来获得它的特殊含义。

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'
Run Code Online (Sandbox Code Playgroud)

会做你想做的。

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

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

`REGEXP1\|REGEXP2'

匹配 REGEXP1 或 REGEXP2。

注意反斜杠...

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

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

  • 对于其他人对此答案感到困惑 \| 仅适用于 gnu sed(在 os x 上的 gsed)而不是 vanilla sed(在 os x 上的 sed)。 (38认同)
  • `sed` 的标准 BSD/OS X 版本确实支持交替,但只支持“扩展”正则表达式语法(`-E`)——这意味着管道或括号上都没有反斜杠:`echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'` (10认同)
  • 我编辑了我的答案以指出它仅适用于 GNU sed。 (2认同)

Dan*_*eck 26

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

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

然后您可以使用正则表达式元字符而无需转义它们。例子:

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


jco*_*jco 14

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

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"
Run Code Online (Sandbox Code Playgroud)

输出:

hi hi
Run Code Online (Sandbox Code Playgroud)


小智 9

\|不工作在Solaris 10的sed无论是。我所做的是使用

perl -p -e 's/bl(ia|f)//g'
Run Code Online (Sandbox Code Playgroud)

  • +1 可移植性,因为如果系统具有 perl,它将始终使用此语法,这与 sed 不同。 (2认同)