我想从我的 Clojure 源代码中删除类型提示,所以我尝试了:
echo "(def ^Integer a 1)" | egrep '\^\w+ '
它成功匹配类型提示。
接下来,我尝试了:
echo "(def ^Integer a 1)" | sed s/\^\w+//g
但是sed
不会用空替换类型提示。
我的正则表达式有什么问题?
几乎所有版本都sed
实现了所谓的 POSIX基本正则表达式,而不是扩展正则表达式。'e'egrep
代表 ... 扩展。猜猜它实现了哪种正则表达式。:)
基本正则表达式和扩展正则表达式之间的最大区别之一是它+
只是扩展正则表达式中的一个元字符。 基本 RE 的某些实现接受\+
具有相同含义,但您不能可移植地依赖sed
支持它。
此外,\w
它甚至不是 POSIX 扩展正则表达式语法的一部分;它是一种 Perl 主义,后来被广泛采用(例如被 Python 和 Javascript),但 AFAIK 在任何地方都没有正式标准化。
您需要的构造是
echo "(def ^Integer a 1)" | sed 's/\^[A-Za-z0-9][A-Za-z0-9]*//g'
不,没有更短的方法可以便携地编写它。
您需要将正则表达式包含在'
其中并转义+
:
echo "(def ^Integer a 1)" | sed 's/\^\w\+//g'