Bash: RegEx를 사용한 문자열 교체/단축(RegEx 실패)

Bash: RegEx를 사용한 문자열 교체/단축(RegEx 실패)

Bash를 사용하여 문자열을 줄이고 싶습니다. 불행히도 이것은 계획대로 진행되지 않았습니다. 앞 글자 부분만 갖고 싶습니다. 불행히도 아래 변형 중 하나는 여전히 유사하게 작동합니다. 어떻게 써야 제대로 쓰여질까요?

var="backup_user-data_2101220046.tgz"

var2="${var/_[0-9]{10}.tgz/''}"
var2="${var/'\_[0-9]+\.tgz'/''}"

답변1

ksh93 연산자 에서 ${var/pattern/replacement}패턴은 정규식이 아닌 쉘 와일드카드 패턴으로 해석됩니다.

~(G)ksh93에서는 각각 을 사용하여 기본, 확장 또는 향상된 정규식으로 전환할 수 있으므로 ~(E)다음 ~(X)을 수행할 수 있습니다.

var2=${var/~(E)_[0-9]{10}\.tgz$/}

예를 들어. 또는 확장된 글로벌 모드를 사용하세요.

var2=${var/%_{10}([0-9]).tgz/}

(와 동일합니다 var2=${var%%_{10}([0-9]).tgz})

bash, ksh93의 zsh복사 연산자와 비슷 ${var/pattern/replacement}하지만 와일드카드 연산자가 더 제한됩니다. 이 extglob옵션이 활성화되면 확장 연산자는 지원되지만 ksh88ksh93의 상위 수준 연산자, 특히 ksh93의 확장 연산자는 지원되지 않습니다 {x,y}(...).

그러나 그것은 그것을 지원합니다 +(...). 그래서 당신은 이것을 할 수 있습니다 :

shopt -s extglob
var2=${var/%_+([0-9]).tgz/}

정규식 지원을 확장 하려면 생성된 연산자 를 bash사용할 수 있습니다 .=~[[...]]

regexp='^(.*)_[0-9]{10}\.tgz$'
if [[ $var =~ $regexp ]]; then
  var2=${BASH_REMATCH[1]}
else
  var2=$var1
fi

완전성을 위해 zshksh93을 복제하고 ${var/pattern/replacement}options를 사용하여 ksh88 와일드카드 확장을 지원했지만 options를 kshglob사용하는 자체 확장 glob 연산자가 있습니다 extendedglob. 이를 통해 ERE에 해당하는 것은 {x,y}이므로 (#cx,y)다음을 수행할 수 있습니다.

set -o extendedglob
var2=${var/%_[0-9](#c10).tgz}

(세 가지 셸 중에서 zsh이것이 0123456789에만 일치하는 유일한 것입니다 [0-9]. ksh93과 bash는 일반적으로 ⑱과 같이 수천 개의 문자와 일치합니다.

답변2

"backup_user-data"만 검색하려는 경우:

$ var="backup_user-data_2101220046.tgz"
$ echo "${var%_*}"
backup_user-data

관련 정보