다음 명령을 사용하여 16진수 코드 0900(अ 대신)부터 097F(в 대신)의 문자 집합 범위를 grep합니다. अ 및 в 대신 16진수 코드를 사용하는 방법은 무엇입니까?
bzcat archive.bz2 | grep -v '<[अ-व]*\s' | tr '[:punct:][:blank:][:digit:]' '\n' | uniq | grep -o '^[अ-व]*$' | sort -f | uniq -c | sort -nr | head -50000 | awk '{print "<w f=\""$1"\">"$2"</w>"}' > hindi.xml
다음과 같은 결과가 나타납니다.
<w f="399651">और</w>
<w f="264423">एक</w>
<w f="213707">पर</w>
<w f="74728">कर</w>
<w f="44281">तक</w>
<w f="35125">कई</w>
<w f="26628">द</w>
<w f="23981">इन</w>
<w f="22861">जब</w>
...
위 명령에서 अ 및 в 대신 16진수 코드를 사용하고 싶습니다.
16진수 코드 사용이 전혀 불가능한 경우 문자 집합('अ-в')에 16진수 코드 대신 유니코드를 사용할 수 있나요?
우분투 10.04를 사용하고 있습니다
답변1
보고 있다grep: 일본어 한자가 포함된 모든 줄 찾기.
텍스트는 일반적으로 UTF-8로 인코딩되므로 UTF-8 인코딩에 사용되는 바이트의 16진수 값을 사용해야 합니다.
grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"
그리고
grep '[अ-व]'
동등하며 수행합니다.문자 클래스/괄호 표현로케일 기반 일치(즉, 일치는 산스크리트어 스크립트의 조합에 따라 다릅니다(즉, 일치는 다음과 같습니다).아니요"\u0905와 \0935 사이의 모든 문자", 그러나 "Devanagari A와 Devanagari VA 사이의 순서"에는 차이가 있을 수 있습니다.
( $'...'
는 bash, ksh 및 zsh에 대한 "ANSI-C 이스케이프 문자열" 구문입니다. 이는 문자를 입력하는 더 간단한 방법일 뿐입니다. \uXXXX
및 이스케이프 문자를 사용하여 \UXXXXXXXX
bash 및 zsh의 코드 포인트를 직접 조사 할 수도 있습니다.)
반면에 다음이 있습니다(-P 참고).
grep -P "\xe0\xa4[\x85-\xb5]"
이것은 다음을 수행합니다바이너리그와 일치바이트값.
답변2
쉘 이스케이프만으로 충분하다면 다음과 같은 구문을 사용할 수 있습니다 $'\xHH'
.
grep -v "<["$'\x09\x00'"-"$'\x09\x7F'"]*\s"
귀하의 사용 사례에 이 정도면 충분합니까?
답변3
작성하는 "16진수" 값 0x0900
은 정확히 UNICODE 코드 포인트의 값이며 16진수이기도 합니다.
16진수 코드 0900(अ 대신)
나는 HEX UNICODE 코드 포인트를 의미한다고 믿습니다: U0905
.
U-0900의 문자는 귀하가 사용한 문자가 아닙니다: अ
.
캐릭터는 U0905 입니다, 부분이 유니코드 페이지또는 다음 목록에 나열되어 있습니다.이 페이지.
(Ubuntu의 기본 설치) 에서 bash
또는 다음 프로그램을 직접 사용하여( printf /usr/bin/printf
는 아님 sh
) 다음 명령을 사용하여 유니코드 문자를 생성할 수 있습니다.
$ printf '\u0905'
अ
$ /usr/bin/printf '\u0905'
अ
그러나 코드 포인트 번호의 이 문자는 사용된 코드 페이지에 따라 여러 바이트 스트림으로 표시될 수 있습니다.
분명히 UTF-16(UCS-2 등) 및 UTF-32 형식 \U0905
입니다 . 명확하지 않을 수도 있지만 utf-8에서는 다음과 같이 표현됩니다 .0x09 0x05
0x00 0x00 0x09 0x05
0xe0 0xa4 0x85
$ /usr/bin/printf '\u0905' | od -vAn -tx1
e0 a4 85
콘솔의 로케일이 en_US.UTF-8
.
나는 문자열을 애플리케이션이 수신하는 것으로 변환하는 쉘에 대해 이야기하고 있습니다. 이것:
grep "$(printf '\u0905')" file
grep이 필요한 문자를 "확인"하도록 하세요.
위 줄을 이해하려면 echo를 사용할 수 있습니다.
$ echo grep "$(printf '\u0905')" file
grep अ file
그런 다음 요구 사항에 따라 문자 범위를 구축할 수 있습니다.
$ echo grep "$(printf '[\u0905-\u097f]')" file
grep [अ-ॿ] file
귀하의 질문에 대한 답변은 다음과 같습니다.
अ 및 в 대신 16진수 코드를 사용하는 방법은 무엇입니까?
답변4
ASCII가 아닌 왼쪽 및 오른쪽 큰따옴표를 일반 큰따옴표(")로 변환하려고 합니다. 또한 ASCII가 아닌 작은따옴표를 일반 작은따옴표(')로 변환합니다.
파일에서 확인하세요(ubuntu bash shell):
$ grep -P "\x92" infile.txt (single)
$ grep -P "\x93" infile.txt (open double)
$ grep -P "\x94" infile.txt (close double)
번역하세요:
$ /bin/sed "s/\x92/'/g" a.txt > b.txt
$ /bin/sed 's/\x93/"/g' b.txt > c.txt
$ /bin/sed 's/\x94/"/g' c.txt > d.txt