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
이상하게 작동합니다.)