이유를 설명해야 합니다.
$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
일치 표현일하다.
패턴에 정규식 하위 표현식이 하나 이상 포함된 경우 [\(...\)]
역참조 표현식과 일치하는 문자열이 반환되어야 합니다. 일치하므로 다시 돌려받았습니다.\1
hello
\([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/'
차이점을 보세요.
변수는 항상 큰따옴표로 묶어야 합니다. 변수를 따옴표로 묶지 않으면 스크립트가 다음을 수행할 수 있습니다.기절그리고 다음으로 이어진다보안 취약점.