不要使用 grep -v 来检查文件是否不包含特定字符串

2024-01-02

新年第一水。

刷到 StackOverflow 上一个回答1

回答没毛病,但是底下这个点评的 Tom Harrison 言之凿凿地说,可以使用 -v 来反转条件……真是如此?

假设有一个文件 test,内容如下:

a
b

先查找文件中不存在的字符串 c 试试:

$ grep c test; echo $?
1
$ ! grep c test; echo $?
0
$ grep -v c test; echo $?
a
b
0

似乎没问题,两种都对。

再查找文件中存在的字符串 a 呢:

$ grep a test; echo $?
a
0
$ ! grep a test; echo $?
a
1
$ grep -v a test; echo $?
b
0

扯犊子了吧?

原因就在于,-v 反转的是查找条件,而不是查找结果。GNU grep 的手册是这么解释 -v 的:

       -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

-v 会匹配那些不包含 a 的行,自然 b 就被查找出来了。

你可以说这人的意思是 -v 可以反转查找条件,问题是这里是 if 语句,要根据结果的条件来判断,然后进行其他操作,明显这人以为 -v! 是一样的效果。这种点评带有很大的误导性。

那么 -v 能不能实现类似的功能呢?其实是可以的,只不过要结合自己的使用情境配合复杂一点的正则罢了,没必要。

多句嘴,StackOverflow 这个网站虽然很有用,但是对用户并不友好。

我连点赞的权限都没有,还有很多人在瞎点评,而且还是错误的。

有时好不容易搜到一个和自己类似问题,然后就有人点评让你去看某些要么屁用没有要么一堆冗余信息的链接,还说不要重复提问 blah blah……贼烦这种伪精英主义。

我靠,这么水的文章还是什么时候删了吧……

ShellLinux
知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

视频相关的命令和脚本