在Mac上的Sed正则expression式问题,在Linux上工作正常

这在Linux(Debian)上正常工作:

sed -e 's,^[ \t]*psd\(.*\)\;,,' 

在Mac上,我相信我必须使用-E标志,而不是-e

 sed -E 's,^[ \t]*psd\(.*\)\;,,' 

但正则expression式不匹配,因此不会删除我想要的行。

有关如何解决这个问题的任何提示?

示例input:

 apa bepa psd(cepa); depa psd(epa); psd(fepa gepa hepa); 

对于这个input,预期的输出是:

 apa bepa depa psd(epa); 

-E标志意味着使用扩展的正则表达式。 你应该使用-e ,就像在Linux上一样。 Mac OS X中的sed基于BSD sed,所以没有GNU扩展。

复制您的示例输入之后:

 [~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,' apa bepa depa psd(epa); 

'\t''sed'不是标准'sed' ,它是一个GNU扩展。

要匹配'tab' ,您需要在脚本中添加一个真正的'tab' 。 这在文件中很容易,在壳上更难。

AIX,Solaris和HP-UX或其他UNIX中也可能发生同样的问题。

或者,您可以使用sed的GNU版本,而不是Mac OSX提供的实现。

Mac端口为它提供了一个端口sudo port install gsed 。 安装之后,你可以使用gsed而不是sed

除了上面的答案之外,你可以利用一个有用的(但是依赖于shell)的技巧。 在bash中,使用$'\t'来引入一个字面标签字符。 以下在我的Mac上工作:

sed -e 's,^[ '$'\t''*psd\(.*\);,,'

注意整个sed表达式现在由三个连接的字符串组成。

这个技巧可能是有用的,因为你需要特殊的制表符,而不需要匹配其他的空格(即当[[:blank:]]包含太多时)。 对于上述,-e标志不是必需的。

我已经在我的机器上检查了这个示例输入,并且在第三行是从行开始的制表符和正则表达式^[ \t]*psd\(.*\)\; 没有匹配。 这可以通过sed字符类[[:blank:]]来传递,即空格和制表符的组合。 所以你可以试试以下内容:

 sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt 

这产生以下输出:

 apa bepa depa psd(epa); 

但它保留了空白的结果。 为了得到确切的输出,如你所料,我使用了以下内容:

 sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt 

结果:

 apa bepa depa psd(epa); 

这只是匹配模式( !p )的反向输出。

编辑:要匹配在sed(macosx)正则表达式中的制表符字符,你也可以尝试推荐从我如何插入一个选项卡字符与OS X上的SED?