문자열 숫자 정규식 대체

문자열 숫자 정규식 대체

이 대체 정규식을 사용하는 데 약간의 어려움이 있으며 왜 이렇게 작동하는지 이해할 수 없습니다. 내가하고 싶은 것은 마지막 숫자 이후의 모든 숫자를 바꾸는 것입니다 /.

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수 있지만 다음을 사용하여 정규식 대체를 수행할 수도 있습니다.kshsetopt kshglobzshextendedglob[[: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

관련 정보