`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

return 을 .*지정해야 합니다 . 그렇지 않으면 아무 것도 반환되지 않습니다.o123

답변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/'

차이점을 확인하세요.


변수는 항상 큰따옴표로 묶어야 합니다. 변수를 따옴표로 묶지 않으면 스크립트가 만들어질 수 있습니다.질식하다그리고 이어지는보안 허점.

관련 정보