为什么 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
.
作为变通方法,您可以使用这些awk
和sed
命令获得等效输出
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
我试图在该行以空格开头时提取该行的第一个单词,因此我编写了以下命令。但是 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
.
作为变通方法,您可以使用这些awk
和sed
命令获得等效输出
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