使用正則表達式從 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
您可以執行以下操作:
bsdtar --exclude='*-*-*' -xf abb-configs.jar 'abb-*.properties'
提取包含兩個s的
abb-*.properties
除外。-
要使用正則表達式:
bsdtar -'s/^abb-[[:alpha:]]*\.properties$/~/' -'s/.*//' -xf abb-configs.jar
第一個
-s
,對我們要提取的存檔成員進行 noop 替換(~
相當於&
insed
’ss
),第二個刪除我們不想要的那些(與第一個不匹配的)所以我們最終提取了名稱與^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]
ond
。一些 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
文件恰好是此類文件),您可以執行相同操作(假設 GNUxargs
):xargs -rd '\n' -a <( unzip -Z1 abb-configs.jar | grep -xE 'abb-[[:alpha:]]+\.properties' ) unzip -q abb-configs.jar
(
unzip
也將參數視為萬用字元模式,這裡不是問題,因為我們選擇的不包含萬用字元)。