理論: grep -f somefile
または、grep --file=somefile
にリストされているパターンの1つと一致するすべての行を見つけます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
結果:実際、私は1台の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にスクリプトを移植するときに何が間違っているのかを調べるのに2時間かかりました...
答え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をインストールすることをお勧めします。
コードをできるだけ移植可能にしたい場合は、なぜ何もないのか尋ねます。正確に何を達成しようとしていますか?集中する方が良いかもしれません。