我的sed正则表达式有什么问题(适用于egrep,但不适用于sed)?

时间:2012-10-28 23:44:37

标签: regex linux sed clojure grep

我想从Clojure源代码中删除类型提示,所以我尝试了:

echo "(def ^Integer a 1)" | egrep '\^\w+ '

它成功匹配了类型提示。

接下来,我试过了:

echo "(def ^Integer a 1)" | sed s/\^\w+//g

但是sed不会将类型提示替换为空。

我的正则表达式出了什么问题?

2 个答案:

答案 0 :(得分:3)

几乎所有版本的sed都实现了所谓的POSIX 基本正则表达式,而不是扩展正则表达式。 egrep中的'e'代表...延长。猜猜它实现了哪种正则表达式。 :)基本和扩展正则表达式之间的一个重大区别是+只是扩展正则表达式中的元字符。 基本RE的某些实现接受具有相同含义的\+,但您无法依赖sed支持它。

此外,\w甚至不是POSIX扩展正则表达式语法的一部分;它是一种Perl-ism,后来被广泛采用(例如通过Python和Javascript),但AFAIK在任何地方都没有正式标准化。

这里需要的构造是

echo "(def ^Integer a 1)" | sed 's/\^[A-Za-z0-9][A-Za-z0-9]*//g'

不,没有更便宜的方式来编写它。

答案 1 :(得分:1)

您需要将正则表达式括在'中,并且还要转义+

echo "(def ^Integer a 1)" | sed 's/\^\w\+//g'