リソースディレクトリに、次のファイルを含む構成jarがあります。名前は次<text>-<text>.properties
の形式です。<text>-<text>-<alphanumeric>.properties
abb-servicea.properties
abb-servicea-dev1.properties
abb-serviceb-dev2.properties
abb-servicea-prod.properties
abb-serviceb.properties
jarから次のファイルを抽出するだけです。
abb-servicea.properties
abb-serviceb.properties
私は努力したunzip abb-configs.jar abb-*[a-z].properties
。具体的には、abb-servicea.properties
およびを選択することはできませんabb-serviceb.properties
。それもabb-servicea-prod.properties
結局見せてくれます。
abb-servicea.properties
abb-serviceb.properties
abb-servicea-prod.properties
パターン付きファイルを抽出する方法はabb-<servicename>.properties
?
編集する:属性名は任意ですabb-<anyservicename>.properties
。たとえば、次のようになりますabb-serviceb.properties
。したがって、本質的にファイルを次のように抽出する必要があります。
abb-servicea.properties
abb-serviceb.properties
答え1
次のことができます。
bsdtar --exclude='*-*-*' -xf abb-configs.jar 'abb-*.properties'
abb-*.properties
2つの-
sを含む例外が抽出されます。
正規表現を使用するには:
bsdtar -'s/^abb-[[:alpha:]]*\.properties$/~/' -'s/.*//' -xf abb-configs.jar
これらの最初のものは-s
抽出したいアーカイブメンバーに対してnoop置換を実行し( 's~
と同じ&
)、2番目は不要なメンバー(まだ最初のものと一致しません)を削除するため、最終的に式に一致する正規表現のアーカイブメンバーになります。名前を抽出します。sed
s
^abb-[[:alpha:]]*\.properties$
[[:alpha:]]*
0個以上のアルファシーケンスと一致します。[^-]*
以外の文字シーケンスを使用することもできます-
。 「0個以上」の代わりに「1個以上」*
に変更してください。\{1,\}
あなたの場所:
unzip abb-configs.jar abb-*[a-z].properties
最初と*
は[a-z]
シェルワイルドカードなので、引用する必要があります。
unzip abb-configs.jar 'abb-*[a-z].properties'
(ここでは完全な主張が引用されています)。
unzip
パターンを正規表現ではなく(デフォルト)シェルワイルドカードパターンとして考えてください。
シェルワイルドカードは、*
任意の数の文字(.*
正規表現など)を表します。だからここではonとonと一致するabb-servicea-prod.service
ので*
onservicea-pro
と一致します。[a-z]
d
[[:alpha:]]+
一部のシェルには、拡張正規表現や[[:alpha:]]\{1,\}
基本正規表現など、1つ以上の文字と一致することができる高度なワイルドカード演算子があります。これにはksh +([[:alpha:]])
(サポートbash -O extglob
)とzsh -o extendedglob
kshが含まれますが、[[:alpha:]]##
サポートされていませんunzip
。
次のようにして、シェルのワイルドカードパターンを引き続き使用できます(ここではzsh
はい)。
set -o extendedglob
members=( ${(f)"$(bsdtar tf abb-configs.jar)"} )
wanted=( ${(M)members:#abb-[[:alpha:]]##.properties} )
(( $#wanted )) && print -rNC1 -- $wanted |
bsdtar --null -T /dev/stdin -nxf abb-configs.jar
または正規表現の一致grep
(およびすべてのシェル)の場合:
bsdtar tf abb-configs.jar |
grep -xE 'abb-[[:alpha:]]+\.properties' |
tr '\n' '\0' |
bsdtar --null -T /dev/stdin -nxf abb-configs.jar
これらを見てください二つ 質問forの現在のバージョンは、この方法を他のモードで使用する場合のbsdtar
潜在的な問題を示しています。
bsdtar
tar
は、数十の異なるアーカイブ形式で動作できるライブラリに似たCLIインターフェイスなので、libarchive
可能であれば通常アーカイブを処理するために使用したいコマンドの1つです。これは、すべてのアーカイブ形式に同じAPIを使用できるためです。
ZIPファイルがなくインストールできないが、ZIPファイルのみを処理できるbsdtar
Info-ZIPコマンドがある場合(そしてファイルがそのようなファイルである場合)、同じことを行うことができます(GNU仮定)。unzip
jar
xargs
xargs -rd '\n' -a <(
unzip -Z1 abb-configs.jar |
grep -xE 'abb-[[:alpha:]]+\.properties'
) unzip -q abb-configs.jar
(unzip
また、パラメータをワイルドカードパターンと見なしてください。これは、選択したパラメータにワイルドカードが含まれていないため問題ありません。)