grepを使用して行末のパターンを検出する


65

私が行った場合:

$ 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ファイルも表示されますが、これは私の望みではありません。
私はこのスレッドfindまたはls **/*.rarを使用してこれを解決していますが、うまく動作しますが、を介してそれを行うことができるかどうかを知りたいgrepです。

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

ls -R | grep ".rar\n"

結果なし。行の終わりに
グレーピングが見つかったかどうかを発見することに問題があると思いますが、わかりません。

ここで助けてください?


grepこの場合に使用したいのはなぜですか?どうしてfind
devnull

1
@devnullは、行末のみにあるパターンを検出する方法を知っていると、多くの場合に役立ちます。例:移植性、非常に単純なLinuxが組み込まれたルーターでの使用、UnxUtils for Windowsでの使用(findコマンドはWindowsのものと競合する)、...学習;-) 問題は「ディレクトリ内のファイルの一覧表示」(単なるカスタム例)ではなく、「grepコマンドの使用法を理解する」ことです。
Sopalajo de Arrierez 14

1
正直なところ、行末をセパレータとして数えるのであれば、を使用する必要がありますls -1R
mikeserv

1
そして、あなたも必要としませんgrep。私の答えをご覧ください。
mikeserv 14

@mikeserv、-1Rスイッチなしで何が起こるか。どうやら結果は同じです。
ソパラホデアリエレス

回答:


89

$アンカーは、行の末尾に一致します。

ls -R | grep '\.rar$'

findこれにも使用できます:

find . -name '*.rar'

「。」がわかりませんでした。grepでエスケープする必要があります。ワイルドカードとして扱われますか?
thebunnyrules

1
@thebunnyrules "。" 正規表現では、任意の文字のいずれかを意味します。
ヨルダン

10

あなたの質問に加えて、.rar「。rar」だけでなく.rar。この場合、おそらく問題では.ありませんが、正規表現でエスケープする必要があります。

ls -R | grep "\.rar$"

それ.asc*ascパターンのようなものですか?したがって、たとえばに一致しwhereverascます。
ソパラホデアリエーレス14

2
@SopalajodeArrierezいいえ、すべての文字グループではなく、すべての単一文字に一致しxrarます。
ハウケレイジング

5

grep単語の境界から文字列を探すように指示することもできます。A .は、こうした境界の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

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


一見同じように見えますが、実際は少し異なります。ありがとう、@ slm。"単純な引用符の代わりに二重引用符を使用すると気になりますか?
ソパラホデアリエレス14

1
@SopalajodeArrierez-いいえ、どちらの方法でも機能します。これにより、w /で始まる名前のファイルが検索されます.rar。しかし、これらはの使用に関する問題にはなりませんls -R。たまたまls -Ra
slm

このわずかな違いを一般に説明することに興味がある人はいますか?
ハウケレイジング

@HaukeLaging 私の例での-P切り替えgrep。これにより、引数のPCRE解釈がトリガーされます。
slm

1
@SopalajodeArrierez-ファイルに\n有効な文字である改行文字()が含まれている場合。にls -1R関係なく、ファイルは強制的に単一の列に表示されます。
slm

0

ただやる:

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

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

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

find . '*.rar'

これは、名前のファイルをブロックしませんでしたxrarafile-rar
slm

出力に他のファイルが残っています。
slm

@slm他にどんなファイルがありますか?短すぎるからだと思う。私は自分自身に気づいただけです。私もそれを修正しました。
mikeserv 14

ファイルafile-rarxrarはまだ出力に含まれています。最新のMODでも変更はありません。厄介な問題はありませんか?通常の方法なしで解決しようとするのは楽しい8
slm

@slmええ、それが私がここに来る理由です。なぜ-dash通過するのか分かりません。xrar事は私が扱うことができるではなく-dash.、私は理解していない-dash.
mikeserv

0

単一引用符を使用して、$を行末として機能させます。いくつかの変数もgrepしたい場合は、以下のように二重引用符と単一引用符の組み合わせを使用します。

grep "$var"'$'

前回の投稿が削除され、重複していると言われました。これがどのように異なるかを説明しましょう。

他の投稿では、二重引用符""を完全に使用するか、単一引用符を完全に使用しています''。どちらにも独自の制限があります。以下に説明します。

すべての二重引用符の問題は次のとおりです。 grep "pattern$"次のエラーが発生します。Illegal variable name.

また、すべての単一引用符を使用しても機能しますが、変数置換が必要な場合は、すべての単一引用符が機能しません。例えば:

A_BOOKファイルFILEの他の文字列を含むstringがある場合。

$ cat FILE
A_BOOK
B_BOOK_NOT_LAST
C_BOOK

BOOKを変数BKに設定した場合

set BK = BOOK

すべての二重引用符でgrepを実行すると、次のエラーが表示されます。grep "${BK}$" FILE*:変数置換の1番目の$、パターンの終わりの2番目(無効な変数名)。

すべての単一引用符でgrepを実行すると、変数の置換は行われません。 grep '${BK}$' FILE何も返さない

二重引用符と単一引用符の組み合わせを使用すると、期待どおりの結果が得られます。変数置換の二重引用符、およびパターンの終わりの単一引用符。

$ grep "${BK}"'$'  # << gives expected output
A_BOOK
C_BOOK

cshを使用しているようです。"foo$"構文は、SHと家族に正常に動作します。
オロリン

はい、オロリン。私はtcshを使用しています。それを指摘してくれてありがとう。
user274900

0

上記に従っても機能しない場合は、行末が原因である可能性があります。修正するには、次の操作dos2unix pr0n.txtを行い、grepもう一度やり直してください。

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