2つの条件、1つは否定、パイプはありませんか?

2つの条件、1つは否定、パイプはありませんか?

次の内容があるとしましょう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に一致し、数字/ハッシュ文字で始まる行を避けません#

用語1.png

オプションを含む2番目のgrepを使用したパイピングは、通常、-v, --invert-match色を混乱させ、-Hファイル名を保存するために負の一致(行の先頭の数字/ハッシュ文字など)を指定できないため、次のようなものを使用する必要があります^#。獣grep -H app test.txt --color=always | grep -v '\[K:.\[m.\[K#'維持色:

用語2.png

...しかし、似たようなことをした後、正しい文字の組み合わせを見ることができ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行です。'^#'-vapp

test.txt:non commented line, matchin /app

...正しいカラーファイル名で一致しました。

^#それでは、上記の汚れたパイプなしで単純に避けるべきパターンとしてそれを達成する方法はありますか?

答え1

grep -E '^([^#].*)?app' ./infiles* /dev/null

とにかくコメントはすでにほとんど扱われていないようですが、行の開始非コメントの一致をオプションに[^#]設定?すると、一致から始まる行が得られます。アプリまたは別のものから始めて、一致する行を取得します。アプリ- しかし、どちらかで始まる行は得られません#

色について - うーん...grep正規表現によって異なりますが、標準のGNU grepは完全一致を最後の項目まで強調表示する必要があります。アプリマッチ。より具体的に説明したい場合は、info grepGNUが適切に強調表示して設定するときにどの環境変数をgrep考慮するのかを見ることができます。あるいは、これに関して満足のいく結果が得られなかった場合は、直接強調表示することもできます。

関連情報