Grep は -v [duplicate] で -B を使用できません。

Grep は -v [duplicate] で -B を使用できません。

私が持っているとしましょうfile

cat
dog
bird

私が実行すると、cat file | grep dog -B 1次のようになります。

cat
dog

私が実行すると、cat file | grep dog -v次のようになります。

cat
bird

cat file | grep dog -v -B 1戻りたいのですが、フラグがないかbirdのように動作します。grep dog

なぜこのフラグを一緒に使用できないのですか?

grep(GNU grep)2.16、2.25でもテスト済み、同じ結果

答え1

私はその逆を得るために私の解決策を追加したいと思いますgrep dog -B 1

cat file | grep "$(cat file | grep dog -B 1)" -v

bird生成されたものと反対の結果を返しますcat file | grep dog -B 1

私の初期の問題は、それがどのように機能するかについての誤解だったようです。私はアプリが-vすべてのコマンドを元に戻すと思いますgrep

実際には、-vフラグが最初に実行された後に-B 1適用されるように見えるので、dog含まれていない行をすべて返し、その行より前のすべての行を返します。つまり、すべての行を意味します。


編集:このソリューションが間違っていることを知っています。サブシェルを使用する2番目のgrepは、それを"$(cat file | grep dog -B 1)"単一のテキストブロックとして扱わないため、反転されません。代わりに、生成された各行は異なるgrepとして扱われます。

サブシェルに次のものが含まれている場合:

cat
dog

元のファイルには、catこのソリューションを使用して削除される前に1つの場所になかった追加のインスタンスが含まれていました。dog

関連情報