또는 `expr match`에서

또는 `expr match`에서

왜 이것이 일치하지 않는지 혼란 스럽습니다.

expr match Unauthenticated123 '^(Unauthenticated|Authenticated).*'

0을 출력합니다.

답변1

귀하의 명령은 다음과 같아야 합니다:

expr match Unauthenticated123 'Unauthenticated\|Authenticated'

문자 수를 일치시키고 싶다면.

인증 없이 문자열의 일부를 반환하려면 다음을 사용하세요.

expr match Unauthenticated123 '\(Unauthenticated\|Authenticated\)'

에서 info coreutils 'expr invocation':

`문자열: 정규 표현식'
     패턴 매칭을 수행합니다. 매개변수가 문자열로 변환됩니다.
     두 번째 것이 고려됩니다(기본, GNU `grep')
     암시적으로 "^"가 앞에 오는 정규식입니다. 첫 번째
     그런 다음 매개변수는 이 정규식과 일치됩니다.

     일치가 성공하고 REGEX가 "\(" 및 "\)"를 사용하는 경우 ":"
     표현식은 STRING AND를 반환합니다.
     그렇지 않으면 문자 수를 반환합니다.
     성냥.

     일치가 실패하면 ":" 연산자는 빈 문자열을 반환합니다.
     REGEX에서는 "\(" 및 "\)"를 사용하고, 그렇지 않으면 0을 사용합니다.

     첫 번째 "\( ... \)" 쌍만 반환 값과 관련됩니다.
     추가 쌍은 일반 그룹화에만 의미가 있습니다.
     표현식 연산자.

     정규식에서 "\+", "\?" 및 "\|"는 연산자입니다.
     하나 이상, 0개 또는 1개 또는 개별적으로 일치
     대안. SunOS 및 기타 "expr"은 이를 일반으로 취급합니다.
     수치. (POSIX에서는 두 가지 동작을 모두 허용합니다.) *정규식 참고
     표현식 라이브러리: (regex)정규 표현식에 대한 자세한 내용은 맨 위로 이동
     통사론. *참고된 예시 중 일부는 expr::의 예시입니다.

답변2

및 둘 다 matchGNU 확장입니다(그리고 패턴이 (표준에 해당하는)로 시작될 때의 동작은 \|구현마다 다릅니다). 표준적으로는 다음과 같이 합니다.:match^

expr " $string" : " Authenticated" '|' " $string" : " Unauthenticated"

선행 공백은 $stringor are 연산자로 시작하는 값에서 문제가 발생하지 않도록 하기 위한 것이지만, 일치하는 문자 수에 1을 더한다는 의미입니다.-expr

GNU를 사용하면 다음과 expr같이 작성할 수 있습니다.

expr + "$string" : 'Authenticated\|Unauthenticated'

+우연히 연산자이더라도 $string문자열 로 처리해야 합니다 expr. expr정규식은 대체 연산자가 없는 기본 정규식입니다(여기서 is |도 특별하지 않습니다). GNU 구현에서는 이를 \|확장으로 처리합니다.

or로 시작 하는지 확인하려면 $string다음을 사용하는 것이 좋습니다.AuthenticatedUnauthenticated

case $string in
  (Authenticated* | Unauthenticated*) do-something
esac

답변3

$ expr match "Unauthenticated123" '^\(Unauthenticated\|Authenticated\).*'\괄호와 파이프를 사용하여 이스케이프 해야 합니다 .

관련 정보