Answers:
“|”还需要一个反斜杠来获得它的特殊含义。
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中使用的变体,其行为不同。
sed
确实支持交替,但只支持“扩展”正则表达式语法( -E
) - 这意味着管道或括号上没有反斜杠: echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
由于有关于非Gnu的几条评论 sed
实现:至少在OS X上,您可以使用 -E
论证 sed
:
将正则表达式解释为扩展(现代)正则表达式而不是基本正则表达式(BRE)。 re_format(7)手册页完全描述了这两种格式。
然后,您可以使用正则表达式元字符而不转义它们。例:
$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
blib bou
该 \|
也不适用于Solaris 10上的sed。我做的是使用
perl -p -e 's/bl(ia|f)//g'
后续:sed -E允许它在MacOS上。没有反斜杠需要|。
sed -E 's/this|orthat/oooo/g' infile