我正在使用 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