grep을 사용하여 고정된 수의 문자로 문자열을 일치시킵니다.

grep을 사용하여 고정된 수의 문자로 문자열을 일치시킵니다.

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

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

그러나 다음과 같은 결과도 얻은 것으로 나타났습니다. étuis, étude.

e나는 이것이 위 인용문의 표기법과 관련이 있다고 생각합니다.

이런 일이 발생하지 않도록 하려면 어떤 조치를 취해야 합니까?

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

답변1

grep캐릭터에 대한 생각지역에 따라 다름. 유니코드가 아닌 로케일에 있고 유니코드 문자가 포함된 파일에서 grep하는 경우 문자 수가 일치하지 않습니다. 이렇게 하면 echo $LANG현재 있는 로캘이 표시됩니다.

LC_CTYPE및/또는 환경 변수를 ".UTF-8"로 끝나는 값으로 설정 하면 LANG올바른 동작을 얻게 됩니다.

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

명령과 동일한 줄에 변수를 할당하여 개별 명령의 로케일을 변경할 수 있습니다.

이 구성을 사용하면 멀티바이트 문자가 단일 문자로 처리됩니다. ASCII가 아닌 문자를 완전히 제외하려면 다른 답변 중 일부가 해결책을 제공할 수 있습니다.


다음과 같은 조건이 존재할 경우 오작동이 발생할 수 있거나 최소한 예상한 것과 정확히 같지 않을 수 있습니다.문자 결합. grep라틴어 소문자 E + 급성 문자를 다르게 처리할 수 있으며, 위의 라틴어 소문자 E + 급성 문자를 다르게 처리할 수 있습니다 .

답변2

grepPCRE 지원과 함께 GNU를 사용하면 다음을 수행할 수 있습니다.

grep -Px '\X{6}'

.문자를 일치시킬 때 \X표의 문자/문자를 일치시킵니다.

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

후자는 études7개의 문자, 8바이트 및 6개의 문자소를 갖습니다.

답변3

이 시도:

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

-xPOSIX에서 정의한 대로 전체 줄을 일치시키는 데 사용됩니다(참조grep).

바라보다여기그것이 무엇인지에 대해 좋은 설명을 제공합니다 LC_ALL. utf-8을 설정 LANG하거나 LC_CTYPE사용하여 동일한 동작을 얻을 수 있습니다. 효과의 순서는 LC_ALL=> LANG=> 입니다 LC_CTYPE.

답변4

다음과 같이 시도해 볼 수 있습니다.

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

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

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

이 외에도 대괄호 안에 원하는 문자를 추가하면 됩니다.

관련 정보