我正在使用 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)
会做你想做的。
如您所知,如果所有其他方法都失败了,请阅读手册:-)。
`REGEXP1\|REGEXP2'
匹配 REGEXP1 或 REGEXP2。
注意反斜杠...
不幸的是,正则表达式语法并没有真正标准化......有很多变体,其中“特殊字符”需要\而哪些不需要。在某些情况下,它甚至是可配置的或取决于开关(如在 GNU 中grep,您可以在三种不同的正则表达式方言之间切换)。
这个答案特别适用于GNU sed。还有其他sed变体,例如 BSD 中使用的变体,它们的行为不同。
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)