次の内容があるとしましょうtest.txt
。
# commented line, no match
# commented line, would match /app/
# again commented, would match app
non commented line, matchin /app
non commented line, no match
app
「」という単語を含むすべての行を取得したいのですが、 -いいえコメントがある方 - ファイル名を出力したいです。
明らかに、このマイナーなものはすべてgrep -H 'app' test.txt
に一致し、数字/ハッシュ文字で始まる行を避けません#
。
オプションを含む2番目のgrepを使用したパイピングは、通常、-v, --invert-match
色を混乱させ、-H
ファイル名を保存するために負の一致(行の先頭の数字/ハッシュ文字など)を指定できないため、次のようなものを使用する必要があります^#
。獣grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'
維持色:
...しかし、似たようなことをした後、正しい文字の組み合わせを見ることができgrep -H app test.txt --color=always | hexdump -C
ました。
-v
残念ながら、このオプションを使用して複数の検索パターンを指定できるオプションと一緒に一意の(否定的な)パターンを指定することは不可能です。-e PATTERN, --regexp=PATTERN
:tmp$ grep -H -e 'app' -v '^#' test.txt
grep: ^#: No such file or directory
test.txt:# commented line, no match
test.txt:non commented line, no match
test.txt:
ここでは、検索パターンではなくファイル名としてgrep
解釈されます。したがって、反転された一致が発生し、予想された結果から誤った結果が得られます。それ以外の場合、この例で予想される出力は1行です。'^#'
-v
app
test.txt:non commented line, matchin /app
...正しいカラーファイル名で一致しました。
^#
それでは、上記の汚れたパイプなしで単純に避けるべきパターンとしてそれを達成する方法はありますか?
答え1
grep -E '^([^#].*)?app' ./infiles* /dev/null
とにかくコメントはすでにほとんど扱われていないようですが、行の開始非コメントの一致をオプションに[^#]
設定?
すると、一致から始まる行が得られます。アプリまたは別のものから始めて、一致する行を取得します。アプリ- しかし、どちらかで始まる行は得られません#
。
色について - うーん...grep
正規表現によって異なりますが、標準のGNU grepは完全一致を最後の項目まで強調表示する必要があります。アプリマッチ。より具体的に説明したい場合は、info grep
GNUが適切に強調表示して設定するときにどの環境変数をgrep
考慮するのかを見ることができます。あるいは、これに関して満足のいく結果が得られなかった場合は、直接強調表示することもできます。