Grep:-oフラグと-vフラグの組み合わせが機能しません。

Grep:-oフラグと-vフラグの組み合わせが機能しません。

-ogrepとフラグを組み合わせたいです-v。しかし、何の結果も得られません。私はファイルを持っています:

foo
bar
foobar

私は電話する:grep -vo foo ./file

何を期待していますか?

bar
bar

または


bar
bar

しかし、何の結果も得られません。

grepのマニュアルページから:

   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.
...
   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.

フラグを1つだけ使用すると、期待どおりに動作します。しかし、両方のフラグでgrepを動作させる方法は?私はDebian AMD64でgrep(GNU grep)3.3を使用しています。

答え1

あなたが言いたいことはgrep

  • fooそれを含む各行だけを印刷し、
  • ない行を印刷します。foo

grepに話す内容は次のとおりです。

  • 一致しない行fooまたはを含まない行の一部を印刷します。foo

これは次のように減らすことができます。

  • すべての行を印刷して削除しますfoo

私の考えでsedこれを行うのに最適なツールは次のとおりです。

$ sed 's/foo//g' ./file

bar
bar

これは言う:各行に対してfooグローバルに何も置き換えないによって世界的にこれは行のすべてのインスタンスを意味します。

空白行も削除するには:

$ sed -e 's/foo//g' -e '/^$/d' ./file
bar
bar

これは言う:

  • foo世界中で何も置き換えない、その後
  • 空行ごとに削除します。

関連情報