为什么 grep return 行在字符串的中间,而我希望它在开头锚定?

Why does grep return lines in the middle of the string when I expect it to be anchored at the beginning?

我试图在该行以空格开头时提取该行的第一个单词,因此我编写了以下命令。但是 grep 也会 returns 不应该的第二个词。 ^ 应该匹配行的开头:

echo -e "    cat   foo\n    dog   bar\n" | grep -Eo '^ +[^ ]+'

Returns:

    cat
   foo
    dog
   bar

我希望 return:

    cat
    dog

我 运行 使用 MacOS 10.15.7。

像这样很容易:

echo -e "    cat   foo\n    dog   bar\n" | grep -o '[^$(printf '\t') ].*' | grep -o '^[^ ]\+'

或像这样使用awk

echo -e "    cat   foo\n    dog   bar\n" | awk 'NF==2{print }'

sed像这样:

echo -e "    cat   foo\n    dog   bar\n" | grep -o '[^$(printf '\t') ].*' | sed 's/ .*//'

或像这样使用cut

echo -e "    cat   foo\n    dog   bar\n" | grep -o '[^$(printf '\t') ].*' | cut -d" " -f1

输出:

cat
dog

As stated here in this report, this is actually a bug in BSD grep.

作为变通方法,您可以使用这些awksed命令获得等效输出

cat file
    cat   foo
    dog   bar

sed -E 's/(^[[:blank:]]+[^[:blank:]]+).*//' file
    cat
    dog

awk 'match([=10=], /^[[:blank:]]+[^[:blank:]]+/){print substr([=10=], 1, RLENGTH)}' file
    cat
    dog