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

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

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

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

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

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

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



답변

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와 다르게 취급 할 수 있습니다.


답변

이 시도:

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입니다.


답변

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 그래프가 있습니다.


답변

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

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

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

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

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


답변