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
grep
PCRE 지원과 함께 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
후자는 études
7개의 문자, 8바이트 및 6개의 문자소를 갖습니다.
답변3
답변4
다음과 같이 시도해 볼 수 있습니다.
grep "^[A-Za-z]\{6\}$" myfile.txt
또는 단어에 숫자도 포함될 수 있는 경우:
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
이 외에도 대괄호 안에 원하는 문자를 추가하면 됩니다.