【问题标题】:egrep -o : different behaviour in Linux and MacOSegrep -o :Linux 和 MacOS 中的不同行为
【发布时间】: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


【解决方案1】:

这取决于不同的grep 实现如何处理空匹配([a-zA-Z0-9]* 匹配空字符串)。

我在 Unix&Linux 上写了a longer text about this

简而言之,是否应该返回所有空匹配项?有无数这样的匹配。

【讨论】:

  • 感谢您提供这个优秀的资源!所以空输出并不意味着没有找到匹配项,而是 empty string 是匹配项,对吧?也许区分这两种情况的一种方法是检查grep 退出代码,对吗?
  • @Kubuntuer82 这取决于您希望grep 做什么。如果您真的只需要检查匹配项,那么我会使用grep -q 并检查退出状态(根本没有-o)。
  • @Kubuntuer82 例如if grep -q 'pattern' <<<'string'; then ...; fi,或等效的 shell 模式,if [[ 'string' == pattern ]](尽管它使用 shell 通配模式而不是正则表达式),或 [[ 'string' =~ regex ]]
  • 我想要实现的是两种行为中的第一种(即在输出中获得“测试”),但是当我得到一个空输出时,我认为没有匹配项。我的意思是,由于您上面所说的,当我在输出中得到一个空行时,我可以检查退出代码以查看空行的含义(没有匹配项或空字符串是匹配项)。但实际上,如果我想要得到“测试”,那么我只需要确保我得到它,但我认为仍然检查退出代码有利于调试:-)(我会得到 0 作为退出代码和也许我会理解 egrep 发现了什么)。
猜你喜欢
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多