1

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

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

它成功匹配类型提示。

接下来,我尝试了:

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

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

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

4

2 回答 2

3

几乎所有版本都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'

不,没有更短的方法可以便携地编写它。

于 2012-10-28T23:52:13.997 回答
1

您需要将正则表达式包含在'其中并转义+

echo "(def ^Integer a 1)" | sed 's/\^\w\+//g'
于 2012-10-28T23:51:06.697 回答