複数の数値を含む正規表現ファイル名

複数の数値を含む正規表現ファイル名

次のようなファイルがあるとしましょう。

test_file-1234-master.tar.gz

tar次のコマンドを使用してキャンセルしようとしました。

 tar -xf test_file-[0-9]+-master.tar.gz
 tar -xf test_file-[:digit]-master.tar.gz

しかし幸運はありません。このパターンをどのように合わせますか?

メモ:常にファイルがあります。複数のファイルを開いたくありません。

答え1

+拡張正規表現メタ文字とPOSIX文字クラス(およびそれぞれ)をワイルドカードパターンとして使用しようとしました。[:digit:]

bash同様の「基本」ワイルドカードは、いくつかのワイルドカードのみをサポートすると仮定します。たとえば、次のようになります。

  • ?: 単一文字
  • *:0個以上の文字
  • []:キャラクタークラス
  • {}:リスト
  • [!]:文字クラスを否定する

拡張正規表現のメタ文字とは異なり、「デフォルト」ワイルドカードでは、ワイルドカードの動作を固定された発生回数と一致するように変更することはできません。

したがって、「基本」ワイルドカードを使用すると、最も短くて簡潔なパターンは次のようになります。

tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz

答え2

ksh、のみbash -O extglobzsh -o kshglob

test_file-+([[:digit:]])-master.tar.gz

あなたはbash設定する必要がありますextglobオプションが最初です。これは+(...)、特定のパターンが1つ以上発生することと一致します。[:digit:]括弧内の式[...]がPOSIX定義の場合キャラクタークラスこれには、インド - アラビア語の10進数([[:digit:]]または同じ)が含まれます。[0123456789][0-9]

以下と一致します。

test_file-1234-master.tar.gz
test_file-1-master.tar.gz
test_file-123456789-master.tar.gz

そうだろういいえマッチ:

test_file-1b-master.tar.gz
test_file--master.tar.gz
test_file-a1-master.tar.gz
test_file-abcd-master.tar.gz
test_file-Ⅵ-master.tar.gz # roman numeral
test_file-٨-master.tar.gz  # Eastern Arabic decimal digit

あなたの質問のコマンドは、tar次のように実行する必要があります(ループを使用)。

shopt -s extglob # bash
# setopt kshglob # zsh
for f in test_file-+([[:digit:]])-master.tar.gz; do
    tar xf "$f"
done

より慣用的な短い構文zshは次のとおりです。

setopt extendedglob
for f (test_file-[0-9]##-master.tar.gz) tar xf $f

(regexpおよびor#の拡張グローバル変数と同じ)*##+

関連情報