特殊式を使用したgrep

特殊式を使用したgrep

.c私のディレクトリにはいくつかのバイナリファイルといくつかの拡張ファイルがあります。

ここで、出力は次のように使用します。ls

arrays.c basic0 basic0.c fromfb fromfb.c oute oute.c segmen.c simp simp.c

ここではバイナリファイルだけをフィルタリングしたいので、次のようにします。

ls |grep -v .c

このコマンドはすべてのファイルをリストし、grepI を使用して .c で終わらないファイルを除くファイルをインポートします。

私が期待したのは

basic0
fromfb
oute
simp

しかし、私が得たもの

fromfb
oute
simp

basic0バイナリがありません。これは何の問題ですか?

答え1

~によるとman grep

期間。単一文字と一致します。

したがって、grep .c次の文字と一致します。c

あなたは探しているか、grep -v \.cより良いものかもしれませんgrep -v '\.c$'

どこ

  • \.脱出の特別な意味。
  • c
  • $行末(lsにパイプされるとファイル名を出力)

ワイルドカードが示すように、grep -vF .cこの-Fフラグを使用してgrepに正規表現ではなく単純な文字列でargを使用するように指示することもできます。

答え2

ピリオドを終了するには、「\.」を使用する必要があります。ls | grep -v "\.c$".executeを試してください。grep -v .cその文字を含まないすべてのレコードを参照します。 他の文字の前に

答え3

男性

man grep私たちに教えてください

期間。単一文字と一致します。

これは.c、任意の単一文字に一致し、それに続くことを意味します。。式は固定されていないため、後に文字を含むすべての文字列と一致します。

テストしてみましょう。旗を使わないと-vどうなりますか?

テスト

みましょう。まずテストを設定しました。

~ $ mkdir test
~ $ cd test
~/test $ touch arrays.c
~/test $ touch basic0
~/test $ touch basic0.c
~/test $ touch fromfb
~/test $ touch fromfb.c
~/test $ touch oute
~/test $ touch oute.c
~/test $ touch segmen.c
~/test $ touch simp
~/test $ touch simp.c
~/test $ ls
arrays.c  basic0.c  fromfb.c  oute.c    simp
basic0    fromfb    oute      segmen.c  simp.c

次にテストしますls | grep .c

~/test $ ls|grep .c
arrays.c
basic0
basic0.c
fromfb.c
oute.c
segmen.c
simp.c

ご覧のとおり、予想されるCソースコードが一致するだけでなく、バ​​イナリbasic0も一致します。これ.と一致(驚くべきことではありません)一致しますc

解決策

Cソースを一致させて除外しようとしています。このファイルは次に終了します。。氏だから私たちはgrepにこれと一致するように指示します。

~/test $ ls|grep "\.c$"
arrays.c
basic0.c
fromfb.c
oute.c
segmen.c
simp.c

私たちはここで2つのことをします。まず、私たちはドットを脱出してそれを作りました。テキストポイント「単一文字」ではありません。ただし、これはまだターゲットであってfoo.c.barも、そうでない場合もある名前のファイルと一致します。
そうでないと仮定すると、cを最後の文字に変更します。これで文字列をマッチさせています。終わりドットと

再適用は-v読者の練習問題として残されます。

関連情報