Bash

使用正則表達式從 jar 中提取特定文件

  • June 1, 2022

我有一個配置 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.propertiesabb-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 

您可以執行以下操作:

bsdtar --exclude='*-*-*' -xf abb-configs.jar 'abb-*.properties'

提取包含兩個s的abb-*.properties除外。-

要使用正則表達式:

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

第一個-s,對我們要提取的存檔成員進行 noop 替換(~相當於&in sed’s s),第二個刪除我們不想要的那些(與第一個不匹配的)所以我們最終提取了名稱與^abb-[[:alpha:]]*\.properties$正則表達式匹配的存檔成員。

[[:alpha:]]*匹配任何 0 個或多個 alpha 的序列。您還可以[^-]*用於 . 以外的字元序列-。替換*\{1,\}“1 或更多”而不是“0 或更多”。


在你的:

unzip abb-configs.jar abb-*[a-z].properties

首先註意*and[a-z]應該被引用,因為它們是 shell globbing 運算符:

unzip abb-configs.jar 'abb-*[a-z].properties'

(這裡引用了整個論點)。

unzip將模式視為(基本)shell 萬用字元模式,而不是正則表達式。

在 shell 萬用字元中,*代表任意數量的字元(如.*在正則表達式中)。所以在這裡,它匹配 onabb-servicea-prod.service因為*匹配 onservicea-pro[a-z]on d

一些 shell 具有高級萬用字元運算符,可以匹配一個或多個 alpha [[:alpha:]]+,例如擴展正則表達式的 或[[:alpha:]]\{1,\}基本正則表達式的 。這包括 ksh 的+([[:alpha:]])(也支持bash -O extglob)和zsh -o extendedglob’s [[:alpha:]]##,但那些不受unzip.

您仍然可以通過以下方式使用您的 shell 的萬用字元模式(此處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

如果將該方法用於其他模式,請參閱目前版本的這兩個 問題以獲取潛在問題的提示。bsdtar


bsdtar是類似於庫tar的 CLI 介面libarchive,可以操作數十種不同的存檔格式,如果可能的話,您通常想要使用的一個命令來處理存檔,因為您可以對所有存檔格式使用相同的 API。

如果您沒有也無法安裝bsdtar,但您有 Info-ZIP 的unzip命令,該命令只能處理 ZIP 文件(並且jar文件恰好是此類文件),您可以執行相同操作(假設 GNU xargs):

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

unzip也將參數視為萬用字元模式,這裡不是問題,因為我們選擇的不包含萬用字元)。

引用自:https://unix.stackexchange.com/questions/704373