这在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?