정규식을 사용하여 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-*.properties두 개의 -s를 포함하는 예외 가 추출됩니다 .

정규 표현식을 사용하려면:

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

이들 중 첫 번째는 -s추출하려는 아카이브 멤버에 대해 noop 교체를 수행하고( 's ~와 동일 &) 두 번째는 원하지 않는 멤버(아직 첫 번째 항목과 일치하지 않음)를 제거하므로 결국 표현식과 일치하는 정규식 아카이브 멤버 로 이름을 추출합니다 .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때문에 *on servicea-pro과 일치합니다 .[a-z]d

[[:alpha:]]+일부 셸에는 확장 정규식이나 [[:alpha:]]\{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가능한 경우 일반적으로 아카이브를 처리하는 데 사용하려는 명령 중 하나입니다. 그러면 모든 아카이브 형식에 동일한 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또한 매개변수를 와일드카드 패턴으로 간주하십시오. 이는 우리가 선택한 매개변수에 와일드카드가 포함되어 있지 않기 때문에 문제가 되지 않습니다.)

관련 정보