5

これはよく知られたタスクであり、簡単に説明できます。

テキストファイルfoo.txtと除外文字列のブラックリストファイルを1行に1つずつ指定すると、除外文字列を含まないfoo.txtの行のみを含むfoo_filtered.txtが生成されます。

一般的なアプリケーションは、ビルドログからコンパイラの警告をフィルタリングすることですが、自分のものではないファイルの警告を無視します。ファイルfoo.txtは、警告ファイル(ビルドログからフィルタリングされたもの)であり、ファイル名が1行に1つずつ記載されたブラックリストファイルexclude_filenames.txtです。

私はそれがPerlやAWKのような手続き型言語でどのように行われるかを知っており、cut、comm、sortなどのLinuxコマンドの組み合わせでもそれを行ってきました。

しかし、私はxargsに本当に近づくべきだと感じており、最後のステップを見ることができません。

expected_filenames.txtにファイル名が1つしかない場合は、

grep -v foo.txt `cat excluded_filenames.txt`

それをします。

そして、私はファイル名を1行に1つずつ取得できることを知っています

xargs -L1 -a excluded_filenames.txt

では、手続き型言語で明示的なループを使用せずに、これら2つを1つのソリューションに組み合わせるにはどうすればよいでしょうか。

シンプルでエレガントなソリューションを探しています。

4

1 に答える 1

9

このオプションを使用する必要があり-fます(またはfgrep同じものを使用できます)。

grep -vf excluded_filenames.txt foo.txt

あなたはまた-F、あなたが尋ねたことに対するより直接的に答えであるものを使うことができます:

grep -vF "`cat excluded_filenames.txt`" foo.txt

からman grep

-f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

-F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
于 2011-10-10T14:19:36.750 に答える