를 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
입니다.
답변
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 그래프가 있습니다.
답변
다음과 같은 것을 시도해 볼 수 있습니다.
grep "^[A-Za-z]\{6\}$" myfile.txt
또는 단어에 숫자가 포함될 수있는 경우 :
grep "^[A-Za-z0-9]\{6\}$" myfile.txt
대괄호에 원하는 문자를 추가하십시오.