次の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
私はどこで間違っていますか?
答え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