web-dev-qa-db-ja.com

通常のgrep式を使用したls-l

次の1000個のファイルがあります

ls -ltr | grep list_of_cars | sort

-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-0.json
-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-1.json
-rw-r--r-- 1 root root   259 Dec 24 16:29 list_of_cars-2.json
.
.
.

-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-996.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-997.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-998.json
-rw-r--r-- 1 root root   260 Dec 24 16:29 list_of_cars-999.json

しかし、次の通常の構文でlist_of_cars-[0-999].jsonを使用してすべてのファイルをキャプチャしようとすると、1000ではなく10のファイルしか取得されません。なぜですか?

ls -ltr | sort | awk '{print $NF}' | grep "^list_of_cars-[0-999].json"
list_of_cars-0.json
list_of_cars-1.json
list_of_cars-2.json
list_of_cars-3.json
list_of_cars-4.json
list_of_cars-5.json
list_of_cars-6.json
list_of_cars-7.json
list_of_cars-8.json
list_of_cars-9.json

私はどこが間違っていますか?

2
yael

予備的注意grepで基本的な正規表現(デフォルト)を使用すると、かなりの数のメタ文字がバックスラッシュでエスケープされます(「基本vs拡張正規表現」 grep man page )。以下の例では、これらの余分なエスケープを避けたので、grep -E <regexp>を使用して拡張正規表現として使用する必要があります(または、関連するメタ文字を自分でエスケープする必要があります)。


正規表現で[0-999]は、「0〜9、9、または9の範囲の1文字に正確に一致する」ことを意味します。

あなたが探しているのは(私が最初に最も簡単なものを探します)「0から9の範囲の任意の数の文字に一致する」であり、これは[0-9]*に変換されます。

.はどの文字とも一致することにも注意してください。ピリオドを正確に一致させるには、値を\.としてエスケープする必要があります。

したがって、最終的な正規表現は^list_of_cars-[0-9]*\.jsonになります。

これで、これは0桁以上に一致するため、list_of_cars-.jsonが一致します。 「0〜9の範囲の1つ以上の文字に一致する」と尋ねることで、1つのステップを制限できます。これは^list_of_cars-[0-9]+\.jsonになります。

999 => ^list_of_cars-[0-9]{1,3}\.jsonを超える結果が得られないようにしたい場合は、「0〜9の範囲で1〜3文字に一致する」を指定することでさらに制限を設けることができます。

6
Zeitounator