이유에 대한 설명이 필요합니다.
$test=`expr "hello" : "\([a-z]*\)"`; echo $test
을 인쇄합니다 hello
. 여기서는 다음과 같습니다.
$test=`expr "hello" : "hel"`; echo $test
일치하는 문자 수를 반환합니다.
그리고 또한:
$ test=`expr "hello123there" : ".*o\([0-9]*\)"t`; echo $test
return 을 .*
지정해야 합니다 . 그렇지 않으면 아무 것도 반환되지 않습니다.o
123
답변1
맨 페이지 EG에 바로 있습니다. http://ss64.com/bash/expr.html
패턴 일치는 ( 및 ) 또는 null 사이에서 일치하는 문자열을 반환합니다. ( 및 )를 사용하지 않으면 일치하는 문자 수 또는 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/'
차이점을 확인하세요.
변수는 항상 큰따옴표로 묶어야 합니다. 변수를 따옴표로 묶지 않으면 스크립트가 만들어질 수 있습니다.질식하다그리고 이어지는보안 허점.