web-dev-qa-db-ja.com

grepで行末のパターンを検出する

私が行った場合:

$ ls -R
.:
4Shared/  Cloud/

./4Shared:
UFAIZLV2R7.part3.rar

./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part

.rarファイルのみを一覧表示する場合、grepを使用すると、.rar.partファイルも表示されます。私の望みは何ですか。
this thread で指示されているように、findまたはls **/*.rarを使用してこれを解決していますが、それらは正常に機能しますが、 grepを使用してください。

私は試しました(EOLについて考える):

ls -R | grep ".rar\n"

結果なし。
問題は、行の終わりで手探りが見つかった場合が検出されたかどうかにあると思いますが、よくわかりません。

ここで何か助けてください。

72

$アンカーは行の終わりと一致します。

ls -R | grep '\.rar$'

これにはfindを使用することもできます。

find . -name '*.rar'
96
jordanm

質問に加えて、.rarは「.rar」だけでなく、rarの前のすべての文字(.を含む)にも一致することに注意してください。この場合、おそらく問題ではありませんが、.は正規表現でエスケープする必要があります。

ls -R | grep "\.rar$"
11
Hauke Laging

grepに、Wordの境界から始まる文字列を探すように指示することもできます。 .は、このような境界の1つです。

$ ls -R | grep '\brar$'

このサンプルデータがあるとします。

$ ls -1
afile.rar
xrar
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part2.rar.part

このコマンドは、.rar拡張子を持つファイルのみを検索します。

$ ls -R | grep '\brar$'
afile.rar

これはどのように機能しますか?

メタ文字\bは、キャレットやドル記号のようなアンカーです。 「単語境界」と呼ばれる位置で一致します。この一致は長さがゼロです。

これが機能しない状況

blah-rarという名前のファイルがある場合、これらも検出されます。

$ ls -R | grep '\brar$'
afile-rar
afile.rar

これは、通常、英数字以外の文字は境界文字と見なされるため、このアプローチをすり抜けてしまうためです。

5
slm

上記に従っても問題が解決しない場合は、行末が原因である可能性があります。修正するには、次のようにします:dos2unix pr0n.txtして、もう一度grepを実行してください。

0
typelogic

ただ:

ls -1R -I"?" -I"??" -I"???" -I"*[!.][!r][!a][!r]"

grepはまったく必要ありません。

注:上記は機能しますが、少なくともが得られることを除いて、少なくともafile-rarと私は理由がわかりません。ここに残しておきますが、誇りに思いません。いずれにせよ、他の人が言ったように:

find . '*.rar'
0
mikeserv