Grep 不能将 -B 与 -v 一起使用

Grep 不能将 -B 与 -v 一起使用

说我有file

cat
dog
bird

如果我运行cat file | grep dog -B 1我会得到:

cat
dog

如果我运行cat file | grep dog -v我会得到:

cat
bird

我希望cat file | grep dog -v -B 1能够返回,bird但它的行为就像grep dog没有任何标志。

为什么我不能一起使用这些标志?

grep (GNU grep) 2.16,也在 2.25 上进行了测试,结果相同

答案1

我只是想添加我的解决方案以获得逆grep dog -B 1

cat file | grep "$(cat file | grep dog -B 1)" -v

它返回与产生bird的相反的结果cat file | grep dog -B 1

看来我最初的问题只是误解了它应该如何工作。我在想应用-v只会反转任何grep命令。

实际上,似乎该-v标志是先运行,然后-B 1应用的,因此dog返回所有不包含的行,然后返回这些行之前的所有行 1,这意味着所有行。


编辑:我意识到这个解决方案是错误的。它不会反转,因为使用子 shell 的第二个 grep 不将其视为"$(cat file | grep dog -B 1)"单个文本块。相反,生成的每一行都被视为不同的 grep。

如果子shell包含:

cat
dog

原始文件中包含的其他实例在使用此解决方案删除cat之前不在 1 个位置。dog

相关内容