OS X 上的 sed - 似乎无法在正则表达式中使用 +

Posted

技术标签:

【中文标题】OS X 上的 sed - 似乎无法在正则表达式中使用 +【英文标题】:sed on OS X - can't seem to use + in regexps 【发布时间】:2010-11-16 15:56:35 【问题描述】:

现在根据所有文献

echo 1234abcd|sed "s|[0-9]\+|#|g"

应该输出#abcd。和

echo abcd|sed "s|[0-9]\+|#|g"

应该输出 abcd。

但在 OS X 10.4.11 上,第一个表达式输出 1234abcd。使用 * 而不是 + 对第一个示例有效,但在第二个示例中失败,输出 #abcd,因为 [0-9] 模式匹配零次。

+ 运算符在 OS X 的正则表达式中不起作用吗?有其他选择吗?

谢谢

【问题讨论】:

sed 不会“返回 abcd”。它返回 0,并输出“abcd”。程序的输出不是它的返回值。 您说得非常正确,先生。我现在正在修复。 【参考方案1】:

在 OSX 上,sed 默认使用基本 RE。如果你想使用现代 RE,你应该使用 sed -E,包括 "+" 一个或多个运算符。

请参阅 here 以了解 sed 默认使用基本 RE,here 用于现代 RE 语法,here 用于基本 RE (ed) 信息。


或者,如果您有一个完全不支持+的正则表达式引擎,您可以通过转换(例如)简单地使用*

[a-z]+

进入:

[a-z][a-z]*

【讨论】:

这个答案在技术上是正确的,但是我一直对 -E 标志感到沮丧,因为它不能移植到 Linux 发行版中通常包含的任何 sed 版本。警告 Emptor。 @JayTaylor 我刚来这里是因为我的正则表达式在 Ubuntu Lucid 上不能正常工作,指定 -E 解决了这个问题。 @AndreKR -E 标志将在您使用正则表达式的扩展方言时起作用。我希望我能提供更多帮助,如果没有更多细节,我无话可说! @JayTaylor 我以为你是说在 Linux 上 -E 标志不起作用。我发现它不仅适用于 Linux,如果你想使用量词,它甚至是必要的。 现在我明白了混淆点;是的! -E 标志可在 Mac 和兼容 POSIX 的 Linux 版本 sed 之间移植。干杯。【参考方案2】:

过时的基本正则表达式不支持+? 量词。它们是常规字符。

[0-9]+ 的替代品是例如[0-9]1,[0-9][0-9]*

或者您可以使用sed -E 来使用现代的扩展正则表达式。

【讨论】:

看起来-E 仍然没有给你真正的“现代”正则表达式,因为它仍然缺少对其他标准事物的支持,比如\d【参考方案3】:

如果 + 不起作用,您始终可以使用 1,

【讨论】:

【参考方案4】:

你可以使用 awk

# echo 1234abcd| awk 'gsub(/[0-9]+/,"#")1'
#abcd

# echo abcd| awk 'gsub(/[0-9]+/,"#")1'
abcd

【讨论】:

我想我接下来必须学习 awk。不过,我仍然对 sed 感兴趣。 不会阻止你学习 sed,但是一旦你知道了 awk 的进出,就没有必要再使用 sed 了。【参考方案5】:

许多 OS X unix 实用程序的版本缺乏 GNU 等价物的舒适性。正如 Pax 所说,您可以使用 -E:

drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed "s/[0-9]\+/#/g" 
1234abcd
drigz@mbp drigz 0$ echo 1234abcd | /usr/bin/sed -E "s/[0-9]+/#/g" 
#abcd

请注意,需要对正则表达式的语法进行细微更改(在本例中为 \+ 到 +)。

不过,我更喜欢使用 fink 来获取 GNU 实用程序:

drigz@mbp drigz 0$ echo 1234abcd | /sw/bin/sed "s/[0-9]\+/#/g"
#abcd
drigz@mbp drigz 0$ /sw/bin/sed --version
GNU sed version 4.1.5
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

【讨论】:

我假设你的意思是 \\+ 到 + (格式似乎已经吃掉了转义字符)不幸的是,这个地方的防火墙似乎阻止了 fink 和 macports,所以有很多og GNU fun 我无法访问。 hmm.. 有时它会吃掉 \ 有时不会 是的 - 你是对的。你能用旧的方式安装它们吗? (./configure && make && sudo make install) 好主意。我去寻找源头。 自从我发布了我的最后一条评论后,我发现了 Hombrew,因此无需编译或确实使用 fink 或 macports:brew.sh

以上是关于OS X 上的 sed - 似乎无法在正则表达式中使用 +的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式批量重命名 OS X 终端中的文件

多行上的 sed 正则表达式无法捕获所有

aix 上的 sed 正则表达式问题

Mac OS X 上的 GCC 标志 -Os 来自哪里?

不认识匹配组

在 sed 中使用反向引用正则表达式