![如何使 BSD grep 尊重行首锚点](https://linux22.com/image/128920/%E5%A6%82%E4%BD%95%E4%BD%BF%20BSD%20grep%20%E5%B0%8A%E9%87%8D%E8%A1%8C%E9%A6%96%E9%94%9A%E7%82%B9.png)
我试图将一行中的第一个字符与 匹配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”,而是针对传入文本的每个字母给出三次命中。
但我不清楚这个问题是否或何时会得到解决。