grep을 사용하여 고정 된 수의 문자와 일치하는 문자열


9

6사용하여 모든 글자 를 찾으려고합니다 grep. 나는 현재 이것을 가지고있다 :

grep "^.\{6\}$" myfile.txt 

그러나, 나는 또한 다음과 같은 결과를 얻고 있음을 발견하고 étuis, étude.

e위의 단어에서 위의 기호와 관련이 있다고 생각합니다 .

이것이 일어나지 않도록 할 수있는 일이 있습니까?

당신의 도움을 주셔서 감사합니다!

답변:


4

grep캐릭터에 대한 아이디어 는 로케일에 따라 다릅니다 . 유니 코드가 아닌 로케일에 있고 유니 코드 문자가있는 파일에서 grep하면 문자 수가 일치하지 않습니다. 그렇다면 당신이 echo $LANG있는 로케일을 볼 수 있습니다.

당신은 설정하는 경우 LC_CTYPE및 / 또는 LANG".UTF-8"당신이 올바른 행동을 얻을 것이다으로 끝나는 값으로 환경 변수를 :

$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$

명령과 같은 행에 변수를 지정하여 단일 명령에 대한 로케일을 변경할 수 있습니다.

이 구성에서 멀티 바이트 문자는 단일 문자로 간주됩니다. ASCII가 아닌 문자를 완전히 제외하려면 다른 답변 중 일부에 대한 해결책이 있습니다.


문자결합 할 때 상황이 깨지거나 최소한 정확히 예상 한대로 작동하지 않을 수 있습니다 . 귀하 grep는 위의 라틴 문자 L과 문자가 혼합 된 라틴 문자 E를 ACUTE와 다르게 취급 할 수 있습니다.


를 사용 .하면 다음과 같은 wăsd's것이 일치합니다
cuonglm

'"고정 된 문자 수를 가진 문자열"의 일부가 될 수있는 문자입니다.
마이클 호머

아마도. 그리고 당신은 모두를 설정해야 LC_CTYPE하고 LANG, 같은 LC_CTYPE=en_US.UTF-8 LANG=en_US실패됩니다. LC_ALL안전을 위해 사용하십시오 .
cuonglm

2

이 시도:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-x전체 라인을 일치시키고 POSIX에 의해 정의되는 데 사용하십시오 ( grep 참조 ).

무엇을하는 지에 대한 자세한 설명은 여기 를 참조 하십시오LC_ALL . utf-8을 설정 LANG하거나 LC_CTYPE사용하여 동일한 동작을 얻을 수 있습니다. 영향을받는 순서는 LC_ALL=> LANG=> LC_CTYPE입니다.


2

grepPCRE 지원으로 빌드 될 때 GNU를 사용하면 다음을 수행 할 수 있습니다.

grep -Px '\X{6}'

하지만 .경기 문자, \X표의 문자 / graphem 일치합니다.

UTF-8 로케일에서 :

$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études

후자 études에는 7 문자, 8 바이트 및 6 그래프가 있습니다.


작동하지 않는 것 같습니다 : echo épée | grep -Px '\X{6}'ouputépée
cuonglm

@Gnouc, UTF-8 로켈에서 실행해야합니다 ( é위의 UTF-8로 인코딩 된 경우 ).
Stéphane Chazelas

오, 내 실수 UTF-8과 함께 작동합니다.
cuonglm

0

다음과 같은 것을 시도해 볼 수 있습니다.

grep "^[A-Za-z]\{6\}$" myfile.txt

또는 단어에 숫자가 포함될 수있는 경우 :

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

대괄호에 원하는 문자를 추가하십시오.


étude악센트에 해당하는 ASCII 문자가 정규식을 엉망으로 만들기 때문에 이것은 전혀 일치하지 않습니다 .
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.