ls -lと一般的なgrep式

ls -lと一般的なgrep式

次の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].json1000個ではなく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

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

答え1

予備説明:デフォルトの正規表現(デフォルト)を使用して、大量のgrepメタ文字をバックスラッシュにエスケープするように強制します(「デフォルト正規表現と拡張正規表現の比較」を参照)。grepマニュアルページ)。次の例では、これらの追加のエスケープを避けているので、それを拡張正規表現として使用する必要がありますgrep -E <regexp>(または関連するメタ文字を直接エスケープする必要があります)。


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

あなたが探しているのは(最も簡単なものから始めます)「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を超えないようにしたい場合は、=>「0〜9の範囲で1〜3文字の一致」を指定してより制限的に設定できます。^list_of_cars-[0-9]{1,3}\.json

関連情報