web-dev-qa-db-ja.com

複数桁の正規表現ファイル名

次のファイルがあるとします。

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つです。複数のファイルを開こうとはしていません。

4
Siva

ksh、_bash -O extglob_および_zsh -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
_

(_#_は、正規表現_*_および_##_または_+_の拡張グロブ同等物です)。

4
chaos

拡張正規表現のメタ文字とPOSIX文字クラス(+および[:digit:]それぞれ)グロビングパターン;

bashまたは同様の場合、「基本的な」グロビングは、次のような少数のワイルドカードのみをサポートします。

  • ?:単一文字
  • *:0個以上の文字
  • []:文字クラス
  • {}:リスト
  • [!]:否定された文字クラス

拡張正規表現のメタ文字とは異なり、「基本的な」グロビングでは、ワイルドカードの動作を変更して、出現回数を一致させる方法はありません。

したがって、「基本的な」グロビングを使用すると、最も短くてタイトなパターンは次のようになります。

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