`grep`에서 16진수 코드를 사용하여 문자를 지정하는 방법은 무엇입니까?

`grep`에서 16진수 코드를 사용하여 문자를 지정하는 방법은 무엇입니까?

다음 명령을 사용하여 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및 이스케이프 문자를 사용하여 \UXXXXXXXXbash 및 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

관련 정보