linux 正则 mac,关于macos:Mac上的Sed正则表达式问题,在Linux上运行正常

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

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

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

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

但是regexp不匹配,因此不会删除我想要的行。

关于如何解决这个问题有什么建议吗?

样本输入:

apa

bepa

psd(cepa);

depa psd(epa);

psd(fepa gepa hepa);

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

apa

bepa

depa psd(epa);

您的预期输出应该有几行空白。您不需要转义分号。

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

复制示例输入后:

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

apa

bepa

depa psd(epa);

-E也适用于GNUSED,这是他们添加的一个未记录的选项,以符合POSIX。

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

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

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

我的回答中没有提到这一点。您可以始终使用POSIX字符类,[[:space:]]或[[:blank:]]都可以。要在shell中获取文本选项卡,按ctrl-v将为下一个字符提供文本。

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

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

或是酿造人用的brew install gnu-sed --default-names。

对于那些喜欢@antonbabenko的人来说,请注意,在最近的版本中,--default-names被否决了。使用brew install gnu-sed --with-default-names,然后重新打开终端。

除了上面的答案,您还可以利用一个有用的(但依赖于外壳的)技巧。在bash中,使用$'\t'引入一个文本标签字符。以下功能适用于我的Mac电脑:

埃多克斯1〔14〕

请注意,整个SED表达式现在是如何由三个连接的字符串组成的。

如果您特别需要制表符,而不匹配其他空白(即当[[:blank:]]太包含时),则此技巧可能很有用。对于上述情况,-e标志并不重要。

我在我的机器上检查了这个示例输入,当第三行中的制表符从行首开始,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中的制表符,您还可以尝试如何在os x中插入sed中的制表符?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值