如何使 BSD grep 尊重行首锚点

如何使 BSD grep 尊重行首锚点

我试图将一行中的第一个字符与 匹配grep,并仅打印该字符。在 Linux 中使用 GNU grep 2.20 我做了这样的事情:

$ echo ab | grep -o '^.'
a
$ 

这正如我所期望的那样工作 -^将正则表达式锚定到行的开头,并且仅a打印字符。

然而,在 MacOS 上使用 BSD grep 2.5.1 时,我得到了不同的结果:

$ echo ab | egrep -o '^.'
a
b
$

就好像^行首锚点被忽略了。有趣的是,$行尾锚点在两种grep风格上都按预期工作:

$ echo ab | grep -o '.$'
b
$ 

有趣的是,如果不使用该选项,BSD grep 确实会尊重^行首锚点:-o

$ { echo a ; echo b; } | grep '^a'
a
$  
  • BSD grep 有其他方式来表达^何时-o使用吗?

  • 有没有一种可移植的方式来表达^何时-o使用,我可以在 Linux 和 MacOS 上使用?

  • 这是 BSD grep 中的错误吗?

答案1

更深入地挖掘,我发现这种行为在FreeBSD 的错误:

我注意到同一版本的 grep 还有一些问题。我不知道它们是否相关,但我现在将它们附加在这里。

$ 打印 abc | grep -o '^[ac]'

应该只打印“a”,而是针对传入文本的每个字母给出三次命中。

但我不清楚这个问题是否或何时会得到解决。

相关内容