![Grep:「OR」条件を追加する方法は? [コピー]](https://linux33.com/image/19241/Grep%EF%BC%9A%E3%80%8COR%E3%80%8D%E6%9D%A1%E4%BB%B6%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
grepに条件付きORを導入する方法は?たとえば、ファイル形式(JPEGまたはJPG)を見つけて、そのファイルのみをPhotosフォルダに送信します。例えば。目的の場所にファイルを送信し、ファイル形式を取得する方法を知っています。 grep部分の助けが必要です。
私はOS Xを使用していますが、* nixユーティリティは* nix環境で慣れていたよりも修正/カスタマイズされているようです。したがって、答えはできるだけ一般的で移植可能であることを願っています。
答え1
grep
このオプションを複数回使用して、複数の正規表現を渡すことができます。-e
grep -e正規表現1- 金利正規表現2 入力ファイル
一致する行の一致regex1
またはregex2
。
答え2
別のアプローチは次のとおりです。
grep "foo\|bar" /path/to/file
foo
これはテキストまたはbar
ウェブサイトで確認できます。file
答え3
私も正規表現についてはあまり慣れていませんが、誰も答えなかったので試してみます。 OR演算子にはパイプ演算子「|」が使用されます。
以下の正規表現を使用すると、どこかに到着します。
.+((JPG)$|(JPEG)$)
(1回以上一致し、その後に「JPG」または「JPEG」が続きます)
詳細な答え(一部(e)grepを知って編集された):次のファイルを含むフォルダがあるとしましょう。
test.jpeg, test.JpEg, test.JPEG, test.jpg, test.JPG, test.notimagefile, test.gif
(名前はあまり創造的ではありません…)
まず、パターンについて知っていることを定義することから始めます。つまり、名前の終わりを探していることを知っています。したがって、「$」オペランドを使用して、各行が定義されたパターンで終わる必要があることを定義します。私たちはパターンがJPEGまたはJPGでなければならないことを知っています。これを行うには、パイプ"|"をORオペランドとして使用します。現在のモデルは次のとおりです。
((JPEG)|(JPG))$
(「JPEG」または「JPG」で終わるすべての行と一致)
ただし、この例では、唯一の違いはオプションの「E」です。そのために「?」オペランド(オプションの意味)を使用できます。私達は書く:
(JP(E)?G)$
(「J」、「P」、オプションの「E」、「G」パターンで終わるすべてのファイルが該当します。)
ただし、ファイル名に小文字を含むファイルを一致させたい場合があります。そのために、文字クラス「[...]」を紹介します。意味は次のいずれかに一致します。私達は書く:
([jJ][pP]([eE])?[gG])$
(atパターンで終わるすべてのファイルと一致します。例:「j」または「J」、「p」または「P」、オプションの「e」または「E」、その後に「g」または「G」)(grepで「-i」オプションを使用して実行することもできますが、REGEXでは練習用に残しました。)
最後に、パターンが見え始めたので、不要な括弧を省略できます。選択文字(「E」)が1つしかないため、この文字は省略できます。また、ファイルはこのパターンでのみ終了するため、開くかっこと閉じ括弧を省略できます。だから我々は単に次のようになります:
[jJ][pP][eE]?[gG]$
最後に、「.gif」ファイル形式のファイルも探したいと仮定すると、次のパラメータを2番目のパラメータとして追加できます。
([jJ][pP][eE]?[gG])|([gG][iI][fF])$
(ここで、読みやすさ/グループ化のために追加の括弧を追加しました。混乱しているようであれば、自由に削除してください。)
最後に、lsとパイプを使用してすべてのファイル名を(e)grepに送信します。
ls | egrep '([jJ][pP][eE]?[gG])|([gG][iI][fF])$'
結果:
test.gif
test.JPG
test.JpEg
test.JPEG
test.jpg
test.JPG
2番目の編集:-iオプションを使用して角かっこを省略すると、次のように短縮できます。
ls | egrep -i 'jpe?g|gif$'
答え4
file $file
ファイルを実行して出力を確認してファイル形式を取得しましたか?
tk-mbp:~ tkennedy$ file share/rally.jpg
share/rally.jpg: JPEG image data, JFIF standard 1.01
それともファイル拡張子を見ていますか?
fileコマンドの出力で実際のファイル形式を表示するには、次の手順を実行します。
for file in $(find $dir -type f -exec file {} \; | grep JPEG | cut -d: -f1); do mv $file $photo_dir/ ; done
ファイル拡張子のみを表示している場合は、次の操作をすべて実行できますfind
。
find $dir -type f -name \*jpg -o -name \*jpeg -o -name \*JPG -o -name \*JPEG -exec mv {} $photo_dir/ \;
grepに複数のパラメータを渡す方法を知りたい場合は、Mac OS Xでまたはを使用してegrep
これを実行できます。grep -E
find $dir | grep -E 'jpg|jpeg|JPG|JPEG'
など。