说我有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