누구든지 대괄호를 이스케이프 처리하는 경우 다음 두 명령의 차이점을 알려주거나 의심을 해소할 수 있는 일부 문서를 참조할 수 있습니까?
string=abcABC123ABCabc
$ echo `expr match "$string" 'abc[A-Z]*.2'` #Result is 8, the count of matched characters
$ echo `expr match "$string" '\(abc[A-Z]*.2\)'` #Result is abcABC12, the matched characters
여기서 괄호를 이스케이프 처리한다는 실제 의미는 무엇입니까 \(...\)
?
답변1
GNU를 참조expr
(coreutils의 일부) 및 \(
및 \)
태그 지정 중그룹에 기록된 대로16.4.1 문자열 표현식:
일치가 성공하고 정규 표현식이
‘\(’
and 를 사용하는 경우‘\)’
표현식은 하위 표현식과 일치하는 문자열 부분을 반환합니다. 그렇지 않으면 일치하는 문자 수가 반환됩니다.
문서 참조3 정규 표현식더 알아보기 grep
. 이것통사론정규식의 개수는 다음과 같습니다.파일에 기록하다POSIX에서:
전체 일치 항목이 가장 왼쪽 일치 항목 중 가장 긴 항목과 일치하도록 각 하위 패턴은 왼쪽에서 오른쪽으로 가능한 가장 긴 문자열과 일치해야 합니다. 이를 위해 빈 문자열은 전혀 일치하지 않는 것보다 긴 것으로 처리되어야 합니다. 예를 들어
"\(.*\).*"
BRE를 와 일치하면"abcdef"
하위 표현식은"(\1)"
"abcdef"이고"\(a*\)*"
BRE를 "bc"와 일치하면 하위 표현식"(\1)"
은 빈 문자열입니다.
POSIXexpr
연산자가 포함된 정규 표현식은 다음과 같습니다 :
.
expr1 : expr2
하지만:
문자열 매개변수 사용
length
,하위 문자열,색인, 또는match
지정되지 않은 결과가 생성됩니다.
그래서 이 특별한 사용법은 확장인 것 같습니다.
POSIX 사용법은 :
리소스 섹션에 자세히 설명되어 있습니다.일치 표현;이것성냥여기에 표시된 연산자는 에 해당 :
하지만위치로 변경접두사:
POSIX에서 사용하는 연산자(이전에는 두 개의 연산자)중위(두 피연산자 사이).
그룹으로서,길이등으로 볼 수 있다.확장하다(특정 유틸리티로는 불가능한 비표준 기능 제공) 또는 단순히비표준(다른 방법으로 수행할 수 있는 기능을 수행하는 호환되지 않는 방법) 이것은 하이브리드입니다. POSIX 쉘은 유사한 기능을 제공합니다.길이등, 해당 항목에 명시된 바와 같이매개변수 대체, 즉, ${#parameter}
. 하지만하위 문자열그리고색인명백하고 정확한 등가물은 없습니다. (구문은 다르지만 전체 그룹은 다음을 기반으로 할 수 있습니다.awk
).
답변2
패턴에 하위 표현식이 포함된 경우 \(...\)
일치하는 문자열이 반환됩니다. 이 행동은POSIX에 의해 지정됨:
또는 패턴에 정규식 하위 표현식 "[\(...\)]"이 하나 이상 포함된 경우 역참조 표현식 "\1"과 일치하는 문자열이 반환되어야 합니다. 역참조 표현식 "\1"이 일치하지 않으면 빈 문자열이 반환되어야 합니다.
명령을 다음과 같이 변경해야 합니다.
expr "$string" : '\(abc[A-Z]*.2\)'
모든 POSIX 호환 환경에서 작동하도록 만드세요 expr
. 목적은 match
불특정입니다.
답변3
백슬래시 괄호는 \(...\)
"캡처 그룹"을 만듭니다. expr match
첫 번째 캡처 그룹을 반환하는 것 같습니다.