이 대체 정규식을 사용하는 데 약간의 어려움이 있으며 왜 이렇게 작동하는지 이해할 수 없습니다. 내가하고 싶은 것은 마지막 숫자 이후의 모든 숫자를 바꾸는 것입니다 /
.
str="aa/a0b0/42"
echo ${str/%[[:digit:]]*/5}
echo ${str/%[0-9]*/5}
둘 다 echo
출력으로 생성됩니다. aa/a5
예상되는 출력은 입니다 aa/a0b0/5
.
sed
나는 및 같은 도구를 사용하여 내 문제를 해결할 수 있다는 것을 잘 알고 awk
있으며 이를 수행하는 방법도 알고 있지만 bash 전용 솔루션을 찾고 있습니다.
[0-9]*
확장이 단순한 숫자가 아닌 0b0/42인 이유를 이해하고 싶습니다 .
내 정규식의 내용은 %
다음과 같습니다백엔드 교체.
답변1
그게 하나니까패턴 매칭, 정규 표현식이 아닙니다.
[[:digit:]]*
한 자리 숫자 뒤에 임의의 문자열이 오는 것을 나타내므로 0b0/42
일치가 발생합니다. 한 자리 숫자 , 0
그 뒤에 문자열 b0/42
.
bash
이제 활성화 되면 하나 이상의 패턴 발생을 다음과 일치시킬 extglob
수 있습니다 .+(pattern-list)
$ shopt -s extglob
$ printf '%s\n' "${str/%+([[:digit:]])/5}"
aa/a0b0/5
ksh
기본적으로 에서 복사 된 구문이 에 있습니다 bash
.
에서는 이러한 패턴을 결합하거나 자체 패턴 ( )을 사용할 zsh
수 있지만 다음을 사용하여 정규식 대체를 수행할 수도 있습니다.ksh
setopt kshglob
zsh
extendedglob
[[:digit:]]##
정규식 대체 기능:
$ str="aa/a0b0/42"
$ autoload -U regexp-replace
$ regexp-replace str '[[:digit:]]+$' 5
$ print -rl -- $str
aa/a0b0/5
/
그 뒤의 마지막 부분이 항상 숫자인지 확인하는 경우 POSIXly로 수행할 수 있습니다.
printf '%s/%s\n' "${str%/*}" 5