Mac上的Sed正则表达式问题在Linux上运行良好

时间:2011-07-20 11:46:58

标签: linux macos sed

这在Linux(Debian)上运行良好:

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

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

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

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

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

示例输入:

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

对于该输入,预期输出为:

apa
bepa
depa psd(epa);

5 个答案:

答案 0 :(得分:12)

-E标志表示使用扩展正则表达式。您应该像在Linux上一样使用-e。 Mac OS X中的sed基于BSD sed,因此没有GNU扩展。

复制样本输入后:

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

depa psd(epa);

答案 1 :(得分:8)

'\t'不是'sed'中的标准,它是GNU扩展名。

要匹配'tab',您需要在脚本中放置一个真实的'tab'。这在文件中很容易,在shell中更难。

在AIX,Solaris和HP-UX或其他UNIX中也会出现同样的问题。

答案 2 :(得分:6)

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

Mac port为其提供了一个端口sudo port install gsed。安装后,您可以使用gsed代替sed

答案 3 :(得分:4)

除了上面的答案,你可以利用一个有用的(但依赖于shell)技巧。在bash中,使用$'\t'来引入文字制表符。以下适用于我的Mac:

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

注意整个sed表达式现在包含三个连接字符串。

如果您需要特定的制表符,而不匹配其他空格(即,当[[:blank:]]过于包容时),此技巧可能会有用。对于上述情况,-e标志不是必需的。

答案 4 :(得分:2)

我在我的机器上检查了这个示例输入,并且遇到问题,当在第三行是从行的开头处的制表符并且regexp ^[ \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)中regexp中的制表符,您还可以尝试How can I insert a tab character with sed on OS X?推荐