`expr "hello" : "\([az]*\)"`는 무엇을 의미하나요?

`expr "hello" : "\([az]*\)"`는 무엇을 의미하나요?

이유를 설명해야 합니다.

$test=`expr "hello" : "\([a-z]*\)"`; echo $test

가 출력됩니다 hello. 여기서:

$test=`expr "hello" : "hel"`; echo $test

일치하는 문자의 수가 반환됩니다.

그리고:

$ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test

.*o이후에 반환 하도록 지정해야 합니다 123. 그렇지 않으면 아무것도 반환하지 않습니다.

답변1

맨 페이지 EG에 바로 있습니다. http://ss64.com/bash/expr.html

패턴 일치는 ( 및 ) 사이에 일치하는 문자열을 반환합니다. ( 및 )가 사용되지 않으면 일치하는 문자 수 또는 0을 반환합니다.

답변2

이것이 방법이다expr일치 표현일하다.

패턴에 정규식 하위 표현식이 하나 이상 포함된 경우 [\(...\)]역참조 표현식과 일치하는 문자열이 반환되어야 합니다. 일치하므로 다시 돌려받았습니다.\1hello\([a-z]*\)

expr사용된갈아 바수다\(이므로 하위 표현식을 이스케이프 하고 표현 해야 합니다 \). BRE에서는 (and 의 사용이 )리터럴로 처리됩니다 .

그렇지 않으면 일치하는 문자 수를 얻습니다.


에서는 expr "hello123there" : ".*\([0-9]*\)"t빈 문자열을 반환했습니다. 그 이유는 정규식의 탐욕스러운 성격 때문입니다.가장 긴 부분 문자열과 일치합니다.

*0개 이상의 문자와 일치하므로 0 [0-9]*회 일치할 수 있으며 .*가장 긴 부분 문자열이 일치됩니다 hello123. 그렇기 때문에 빈 문자열이 표시됩니다.

있는 경우 다음을 perl시도해 볼 수 있습니다.

printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*([0-9]*)t/'

그리고:

printf "hello123there" | perl -Mre=debugcolor -ne 'print $1 if /.*o([0-9]*)t/'

차이점을 보세요.


변수는 항상 큰따옴표로 묶어야 합니다. 변수를 따옴표로 묶지 않으면 스크립트가 다음을 수행할 수 있습니다.기절그리고 다음으로 이어진다보안 취약점.

관련 정보