expr 일치에서 이스케이프된 괄호의 의미

expr 일치에서 이스케이프된 괄호의 의미

누구든지 대괄호를 이스케이프 처리하는 경우 다음 두 명령의 차이점을 알려주거나 의심을 해소할 수 있는 일부 문서를 참조할 수 있습니까?

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첫 번째 캡처 그룹을 반환하는 것 같습니다.

관련 정보