我想从Clojure源代码中删除类型提示,所以我尝试了:
echo "(def ^Integer a 1)" | egrep '\^\w+ '
它成功匹配了类型提示。
接下来,我试过了:
echo "(def ^Integer a 1)" | sed s/\^\w+//g
但是sed
不会将类型提示替换为空。
我的正则表达式出了什么问题?
答案 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'