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 - 似乎无法在正则表达式中使用 +的主要内容,如果未能解决你的问题,请参考以下文章