理论: grep -f somefile
或grep --file=somefile
将找到与 中列出的模式之一匹配的所有行somefile
。如果somefile
为空,则没有任何内容匹配。与grep -v
您一起列出以下行不要匹配。
底线: grep -f /dev/null
什么都不匹配,又grep -v -f /dev/null
什么都匹配。
实验:现在尝试一下
% echo blank | grep -f /dev/null
% echo bingo | grep -v -f /dev/null
bingo
结果:事实上,我确实bingo
在一台机器上得到了(而且仅此而已)
unix1% grep --version
grep (GNU grep) 2.20
但我不明白bingo
!?!?在另一台机器上,这次是
unix2% grep --version
grep (BSD grep) 2.5.1-FreeBSD
unix2% uname -rs
Darwin 14.0.0
问题:规格上还有余地吗grep
?我错过了一些法律术语吗?或者是grep (BSD grep) 2.5.1-FreeBSD
越野车?可以肯定的是,我花了两个小时才发现将脚本从 unix1 移植到 unix2 时出了什么问题......
答案1
来自 GNU grep 手册页:
-f FILE, --file=FILE Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.) -v, --invert-match Invert the sense of matching, to select non-matching lines. (-v is specified by POSIX.)
所以grep -f /dev/null
会匹配没有什么并将grep -v -f /dev/null
其反转并匹配一切。
我可以访问大量的 FreeBSD 系统,但是全部他们中的一些人安装了 GNU grep 因为它好得多(都用于速度和功能,尽管看起来确实如此BSD grep 正在迎头赶上)。仍然存在差异,例如单词边界。
我怀疑这是一个 BSD grep 错误,尽管规范可能不明确。来自“追赶”链接的注释:BSD grep 基本上是为了获得 GNU grep 的更宽松许可的克隆,这意味着它至少在某些方面永远“落后”。
如果可能,我建议在使用 BSD grep 的系统上安装 GNU grep。
如果你只是想让你的代码最大程度地可移植,我想我会接着问为什么你什么都没有。你到底想达到什么目的?也许集中精力更好。