를 6
사용하여 모든 글자 를 찾으려고합니다 grep
. 나는 현재 이것을 가지고있다 :
grep "^.\{6\}$" myfile.txt
그러나, 나는 또한 다음과 같은 결과를 얻고 있음을 발견하고 étuis
, étude
.
e
위의 단어에서 위의 기호와 관련이 있다고 생각합니다 .
이것이 일어나지 않도록 할 수있는 일이 있습니까?
당신의 도움을 주셔서 감사합니다!
를 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_CTYPE
하고 LANG
, 같은 LC_CTYPE=en_US.UTF-8 LANG=en_US
실패됩니다. LC_ALL
안전을 위해 사용하십시오 .
grep
PCRE 지원으로 빌드 될 때 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
é
위의 UTF-8로 인코딩 된 경우 ).
.
하면 다음과 같은wăsd's
것이 일치합니다