正規表現を使用してjarから特定のファイルを抽出します。

正規表現を使用してjarから特定のファイルを抽出します。

リソースディレクトリに、次のファイルを含む構成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-*.properties2つの-sを含む例外が抽出されます。

正規表現を使用するには:

bsdtar -'s/^abb-[[:alpha:]]*\.properties$/~/' -'s/.*//' -xf abb-configs.jar

これらの最初のものは-s抽出したいアーカイブメンバーに対してnoop置換を実行し( 's~と同じ&)、2番目は不要なメンバー(まだ最初のものと一致しません)を削除するため、最終的に式に一致する正規表現のアーカイブメンバーになります。名前を抽出します。seds^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 extendedglobkshが含まれますが、[[: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潜在的な問題を示しています。


bsdtartarは、数十の異なるアーカイブ形式で動作できるライブラリに似たCLIインターフェイスなので、libarchive可能であれば通常アーカイブを処理するために使用したいコマンドの1つです。これは、すべてのアーカイブ形式に同じAPIを使用できるためです。

ZIPファイルがなくインストールできないが、ZIPファイルのみを処理できるbsdtarInfo-ZIPコマンドがある場合(そしてファイルがそのようなファイルである場合)、同じことを行うことができます(GNU仮定)。unzipjarxargs

xargs -rd '\n' -a <(
    unzip -Z1 abb-configs.jar |
      grep -xE 'abb-[[:alpha:]]+\.properties'
  ) unzip -q abb-configs.jar

unzipまた、パラメータをワイルドカードパターンと見なしてください。これは、選択したパラメータにワイルドカードが含まれていないため問題ありません。)

おすすめ記事