次の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
私はどこが間違っていますか?
予備的注意: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文字に一致する」を指定することでさらに制限を設けることができます。