grep式を反転する方法


237

次のgrep式は、現在のディレクトリとサブディレクトリにあるすべての.exeファイルと.htmlファイルを一覧表示します。

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

この結果を逆にして、代わりに.htmlまたは.exeではないものをリストする方法を教えてください。(つまり、!=です。)

回答:


337

コマンドラインオプションを使用する-v--invert-match

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

4
-v/ --invert-matchは、戻りコードがgrep正常に実行されたことを示すかどうかを必ずしも反転するのではなく、通常は一致しない行と一致することに注意してください。戻りコードを反転させたい(つまり、すべての行が少なくとも1つではなくパターンに一致しない場合に成功する)場合は、を使用する必要があります! grep。これは、次のような条件式での使用を見つけますif ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi
Zyl

98
grep -v

または

grep --invert-match

以下を使用して同じことを行うこともできますfind

find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

詳細はこちら


2
findコマンドは、このXYの問題に最も意味的なソリューションです。この目的のために組み合わせるlsgrep、せいぜいハックに思えます。これは受け入れられる答えになるはずです。(+1)
Eric Seastrand、2016年

4
@Eric OPの要件に関係なく、grep式の反転は、ファイルの検索よりもはるかに役立ちます。それがほとんどの人がここに来る理由だと思います。
byxor 2017



7

複数回述べたように、反転は-vへのオプションによって実現されますgrep。(うまくいけば面白い)メモを追加して、grepヘルプテキストを手探りで理解できたと思います。

grep --help | grep invert

-v、--invert-match一致しない行を選択します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.