【发布时间】:2018-10-23 21:34:36
【问题描述】:
我有两个脚本,我想在 Linux 机器和 MacOS 机器上运行。但是egrep 命令的不同行为使这些脚本生成不同的输出。
尤其是当我在 Linux (Ubuntu) 上使用 egrep 时会发生这种情况:
$ echo ".test" | egrep "[a-zA-Z0-9]*"
.test
$ echo ".test" | egrep -o "[a-zA-Z0-9]*"
test
$
这就是我在 MacOS 上使用 egrep 时发生的情况
$ echo ".test" | egrep "[a-zA-Z0-9]*"
.test
$ echo ".test" | egrep -o "[a-zA-Z0-9]*"
$
第一个行为是我所期望的,第二个(空输出)是出乎意料的。也许这是在 MacOS 下使用-o 选项实现egrep 的一个错误?
或者,如果第二种行为也是正确的,您是否知道在第二种情况下获得相同行为的方法?
我尝试查看两个命令对应的 man 页面,这是从 Linux 手册页中提取的:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each
such part on a separate output line.
这是从 MacOS 的手册页中提取的:
-o, --only-matching
Prints only the matching part of the lines.
虽然描述看起来有点不同,但两个选项的含义似乎是一样的,那么为什么egrep -o 在 MacOS 中表现不同呢?我没有考虑这个命令的任何微妙方面吗?
【问题讨论】:
-
我删除了 cmets,因为一切都是 described here。我将保留我的这条评论:一般来说,使用正则表达式来提取可能与空字符串匹配的文本是没有意义的.
-
您可以在 Mac 上install the Gnu version 的实用程序(即您从 Linux 知道的那个);默认情况下,它们会在前面添加字母“g”,以便您可以将它们与 Mac 上的原始字符区分开来。
标签: regex shell scripting grep posix-ere