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
옵션이 활성화되면 확장 연산자는 지원되지만 ksh88
ksh93의 상위 수준 연산자, 특히 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
완전성을 위해 zsh
ksh93을 복제하고 ${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