sed 및 grep의 c1-c2 정규 표현식

sed 및 grep의 c1-c2 정규 표현식

나는 이 표현이 [c1-c2]or와 함께 사용될 때 무엇을 하는지 이해하려고 노력하고 있습니다:sedgrep

grep -E "[c1-c2]"

이는 1-9 및 a, b, c와 일치합니다. 내가 이해한 바로는 ASCII 테이블의 1과 c 사이의 문자와 일치해야 합니다.

답변1

[c1-c2]대괄호 표현. 주어진 형식에서 문자 "c", "1" 및 "c"(포함)와 문자 "2" 사이의 문자 범위와 일치합니다. 문자 범위는 로케일에 따라 다릅니다.POSIX 로캘에서는 49("1"의 코드)와 99("c"의 코드) 사이의 ASCII 코드로 구성된 문자 집합입니다. 그러므로:

$ echo : | LANG=C grep -E '[c1-c2]'
:
$ echo 0 | LANG=C grep -E '[c1-c2]'
$ echo A | LANG=C grep -E '[c1-c2]'
A

나는 의도가 그런 것이라고 생각 c1하고 c2관심 범위를 제한하는 단일 문자를 나타내므로 [a-m]대신 그런 것을 작성하게 될 것입니다 [c1-c2].

답변2

POSIX/C 이외의 로케일에서 문자 범위는 ASCII 순서를 사용하지 않고 대신 로케일의 조합 순서를 사용합니다. 이는 일반적으로 ASCII 시퀀스보다 더 복잡합니다.기준문자 범위의 해석이 정의되지 않은 상태로 만들어지지만(읽기: 응용 프로그램에 따라 다름) 많은 로캘이 대문자와 소문자를 구별하므로 이는 다음 1-c과 같이 분류됩니다.

  • 1-"1"부터 해당 그룹의 끝까지(즉, 숫자부터 ... 1까지 9)
  • -c소그룹부터 시작해c

(구두점도 제외됩니다.)

그래서 내 로케일에서는 [1-c]다음과 같습니다... [123456789aàâäbc]! (내 키보드가 지원하는 것보다 더 많은 "a" 변형이 있을 수 있습니다):

grep -Eo '[c1-c2]+' <<< '01234àâäbc'
1234àâäbc

물론 [c1-c2]위 목록에 c및 이 포함되어 있으므로 동일한 항목과 일치합니다 2.

관련 정보