考虑以下输入文件:
1
2
3
4
跑步
{ grep -q 2; cat; } < infile
什么都不打印。我希望它能打印
3
4
如果将其更改为,则可以获得预期的输出
{ sed -n 2q; cat; } < infile
为什么第一个命令不打印预期的输出?
这是一个可搜索的输入文件,符合OPTIONS下的标准:
-q
Quiet. Nothing shall be written to the standard output, regardless of
matching lines. Exit with zero status if an input line is selected.
进一步向下,在“ 应用程序使用情况”下(强调我的):
该
-q
选项提供了一种轻松确定一组文件中是否存在模式(或字符串)的方法。搜索多个文件时,它可以提高性能(因为一旦找到第一个匹配项,它就可以退出)[...]
现在,按照相同的标准(在简介中,在输入文件下)
当标准实用程序读取可搜索的输入文件并在到达文件结尾之前无错误终止时,该实用程序应确保打开的文件描述中的文件偏移量恰好位于该实用程序处理的最后一个字节之后。 ..]
tail -n +2 file
(sed -n 1q; cat) < file
...
仅当可搜索文件时,第二个命令才等效于第一个命令。
为什么要grep -q
消耗整个文件?
这gnu grep
很重要(尽管Kusalananda刚刚确认在OpenBSD上也是如此)
grep
是FreeGrep的分支。