C样式(单行)评论中的Sed替换

时间:2012-08-28 02:49:40

标签: regex sed

我有点困惑为什么这不起作用。我正在尝试做一些更复杂的事情,但我的问题的核心归结为匹配单行C评论。

示例myfile

/* a comment */

运行:

sed 's|/\*\([.]*\)\*/|\1|' ./myfile

不匹配/替换。

为什么?我已将它分成几部分,它似乎适用于各个部分(打开/*,填充,*/和组合(开始/中间和中间/结束),这一切都有效,但把它放在一起不会。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

[.]*正在寻找一个零点或多点的字符串。您希望.成为元字符;删除它周围的方括号。

sed 's|/\*\(.*\)\*/|\1|' ./myfile

请注意,这是一种贪婪的匹配算法;这是sed支持的所有普通(POSIX)版本。这意味着:

XX /* comment1 */ YY /* comment2 */ ZZ

将输出:

XX  comment1 */ YY /* comment2  ZZ

使用经典sed修复它是不可能的,不值得尝试。如果您在sed中支持PCRE(Perl兼容正则表达式),则可以使用非贪婪匹配运算符将其视为两条注释。