次のファイルがあるとします。
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つです。複数のファイルを開こうとはしていません。
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
_
(_#
_は、正規表現_*
_および_##
_または_+
_の拡張グロブ同等物です)。
拡張正規表現のメタ文字とPOSIX文字クラス(+
および[:digit:]
それぞれ)グロビングパターン;
bash
または同様の場合、「基本的な」グロビングは、次のような少数のワイルドカードのみをサポートします。
?
:単一文字*
:0個以上の文字[]
:文字クラス{}
:リスト[!]
:否定された文字クラス拡張正規表現のメタ文字とは異なり、「基本的な」グロビングでは、ワイルドカードの動作を変更して、出現回数を一致させる方法はありません。
したがって、「基本的な」グロビングを使用すると、最も短くてタイトなパターンは次のようになります。
tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz