我正在尝试了解 fgrep 与 grep 有何不同。但是在我的测试结果中,两者没有区别。显然 fgrep 匹配字符串并忽略正则表达式。所以我对此进行了测试,基本 fgrep 可以做的事情,grep 做不到。所以我无法继续,我需要了解为什么我会得到下面的结果,以及 fgrep 之间的区别是什么,因为我明确地不能看到任何测试结果的差异。
$ cat testfile
subscribe|unsubscribe
@lp1n3
$ grep 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
$ fgrep 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
$ grep '@lp1n3' testfile
@lp1n3
$ fgrep '@lp1n3' testfile
@lp1n3
答案1
您可能会发现添加-o
开关会有所帮助,以便更容易地查看正在发生的事情:
$ grep -o 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
这里我们使用grep
基本正则表达式模式,其中|
并不特殊(需要转义才能\|
表示OR
),因此该模式匹配为单个字符串
$ grep -oE 'subscribe|unsubscribe' testfile
subscribe
unsubscribe
这里我们切换到扩展正则表达式 (ERE) 模式,其中|
是正则表达式特殊字符,因此我们匹配两个模式,subscribe
并且unsubscribe
$ grep -oF 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
现在我们以固定字符串模式进行匹配(如fgrep
),并且正如预期的那样|
没有什么特殊之处——就像 BRE 一样。
fgrep
是(正式的,已弃用) 相当于grep -F
,因此其行为完全相同:
$ fgrep -o 'subscribe|unsubscribe' testfile
subscribe|unsubscribe
据我所知,在 BRE 或 ERE 中都不是特殊的,因此总是会给出与或@
相同的结果。fgrep
grep -F