GNU grep 매뉴얼의 문자 클래스

GNU grep 매뉴얼의 문자 클래스

grep 매뉴얼이 대괄호를 사용하여 문자 클래스를 선언하는 이유를 이해하려고 합니다.

https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html

예를 들어, 소문자를 일치시키려면 [:lower:]를 사용하십시오. 그러나 터미널에서 이것을 사용하면 결과는 다음과 같습니다.

$ grep [:lower:] test
grep: character class syntax is [[:space:]], not [:space:]

이 설명서를 사용/이해하는 데 끊임없는 문제가 있습니다. 혹시 잘못된 것이 있습니까? 이중 [[]]로만 작동하는 것 같지만 설명서에는 대신 []를 사용하라고 설명하는 이유가 없습니다.

답변1

grep 매뉴얼이 대괄호를 사용하여 문자 클래스를 선언하는 이유를 이해하려고 합니다.

왜냐하면캐릭터 클래스따라서 괄호 세트는 하나만 있습니다. 대괄호 표현식에도 넣기만 하면 두 개의 세트가 생성된다는 의미입니다.

매뉴얼은 먼저 괄호로 묶인 괄호 표현의 맥락을 제공합니다.

[대괄호 표현식은 및 로 묶인 문자 목록입니다 ].

다음 단락에서는 이러한 맥락을 가정합니다.

이내에대괄호 표현식, 범위 표현식은 하이픈으로 구분된 두 문자로 구성됩니다.

마지막으로 특정 명명된 문자 클래스가 미리 정의되어 있습니다.이내에대괄호 표현식은 다음과 같습니다.

이 두 문자와 하이픈도 대괄호 안에 있어야 합니다. 즉, . [a-f]뿐만 아니라 전체 내용이 입니다 a-f. (*)

문자 클래스도 대괄호 표현식 안에 있으므로 예를 들어 문자 클래스를 [:upper:]대괄호로 묶으면 대괄호 표현식이 제공됩니다 [[:upper:]]. 또는 여러 문자 클래스를 괄호 안에 배치하는 경우 [-[:upper:][:digit:]]대시, 대문자 또는 숫자와 일치하는 문자 클래스를 사용할 수 있습니다 . (대괄호 표현식에는 일반 문자 1개와 문자 클래스 2개가 포함됩니다.)

구문이 왜 이런 것인지는 모르겠습니다.

매뉴얼에는 문자 클래스를 사용하는 방법에 대한 완전한 예도 포함되어 있습니다.

...예를 들어 [[:alnum:]]현재 로케일의 숫자와 문자를 나타내는 문자 클래스입니다.

그것은 말한다:

이러한 클래스 이름의 대괄호는 기호 이름의 일부이며 대괄호 표현식을 구분하는 대괄호와 함께 포함되어야 합니다.

나타나는 오류 메시지도 설명되어 있습니다.

예를 들어 실수로 외부 괄호를 생략하고 검색하면 [:upper:]GNU grep은 진단 메시지를 인쇄하고 정규식을 검색할 의도가 없다고 가정하고 상태 2로 종료합니다 [:epru].

따라서 전체 트랜잭션에 하나의 대괄호 세트만 사용하도록 지시하는 것처럼 보이지는 않습니다.

그 외에도... 예는 다음과 같습니다 [:alnum:]( [:alpha:]유사).

[:alnum:] 영숫자 문자: [:alpha:][:digit:]; "C" 로케일 및 ASCII 문자 인코딩에서는 와 동일합니다 [0-9A-Za-z].

이것은 잘못된 것입니다. [0-9A-Za-z]와 동일합니다 . [[:alnum:]]아니요 [:alnum:]. [:alnum:]0-9A-Za-z, 하지만 둘 다 유용한 작업을 수행하려면 외부 괄호가 필요합니다.

물론 오류 메시지에는 문자 클래스와 대괄호 표현식의 차이점이 언급되지 않은 것 같습니다. 따라서 약간 불분명합니다.


괄호도 셸의 전역 문자이므로 패턴을 인용해야 합니다.

grep '[[:lower:]]' test

그렇지 않으면 쉘은 패턴을 :, e, l, o또는 r이러한 정확한 이름을 가진 파일이 있는 경우 확장합니다.w

(*경고는 문자 범위에 적용되며 그 해석은 로케일과 Bash 의 옵션에 따라 달라집니다. globasciiranges이상하게 작동합니다.)

관련 정보