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


27

다음 명령을 사용하여 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
"작동하지 않는다"는 것은 무엇을 의미합니까? 또한 -v당신의 질문 텍스트에서 당신이 원하는 것이 아닌 것처럼 일치를 반전시킵니다.
Christian.K

@ Christian.K 지연에 대해 죄송합니다 ... 질문을 편집했습니다. 살펴보십시오.

나는 여전히 적절한 답변을 기다리고 있습니다. :(
Dhrubo Bhattacharjee

답변:


21

이 질문에 .

텍스트는 일반적으로 UTF-8로 인코딩됩니다. 따라서 utf-8 인코딩에 사용 된 바이트의 16 진 골짜기를 사용해야합니다.

grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"

grep '[अ-व]'

동일, 그들은 즉, 매칭 (즉, 매칭이되는 데바 나가리 스크립트의 정렬 규칙에 따라 달라집니다 (로케일 기반의 매칭을 수행 하지 않고 대신 "\ u0905와 \ 0,935 사이의 문자는" "아무것도 데바 나가리 사이에 정렬 A와 devanagari VA "; 차이가있을 수 있습니다.

반면에, 당신은 이것을 가지고 있습니다 (주 -P) :

grep -P "\xe0\xa4[\x85-\xb5]"

해당 바이트 값 과 이진 일치를 수행 합니다.


2
접두사 "["$'와 접미사를 설명하십시오"]"
Jonathan Komar

6

쉘 이스케이프가 충분하면 다음 $'\xHH'과 같은 구문을 사용할 수 있습니다 .

grep -v "<["$'\x09\x00'"-"$'\x09\x7F'"]*\s"

사용 사례에 충분합니까?


echo 'अ-व' | hd제공e0 a4 85 - e0 a4 b5
enzotib

실제로 영업 이익은 유니 코드 값을주고,없는 16 진수 UTF-8 인코딩 덤프 : - / 때문에 grep어떤 lib 디렉토리와 연결되지 않은, 나는 그것이 범위 변환이 GREP 수행 할 가질 수없는 것 같아요 : - /
스테판 히메네스

1
BTW, zsh해석 할 수있는 "\u0900""\u097F"(아마입니다)하지만 동작은 연속되는 UTF-8 인코딩 범위에 의존합니다.
Stéphane Gimenez

grep 없음 -v "<["$ '\ x09 \ x00' "-"$ '\ x09 \ x7F' "] * \ s"다음 출력을 제공합니다 <wf = "16929"> x </ w> <wf = " 10995 "> F </ w> <wf ="2548 "> FF </ w> <wf ="762 "> FFFFFF </ w> <wf ="655 "> FFFF </ w> <wf ="266 " > xx </ w> <wf = "215"> FFF </ w> <wf = "117"> xxx </ w> .... 이것은 예상되지 않습니다. :( 대신 16 진수 코드 또는 문자 집합의 수 있습니까 사용 유니 코드 ( 'अ-व')?
Dhrubo Bhattacharjee

6

0x0900작성한 "16 진수"값 은 정확히 16 진수 인 UNICODE 코드 포인트의 값입니다.

16 진 코드 0900 (अ 대신)

나는 당신이 말하는 것은 16 진수 UNICODE 코드 포인트라고 생각합니다 U0905.

U-0900의 캐릭터가 사용한 캐릭터가 아닙니다 : .
그 문자는 U0905입니다 ,의 부분 이 유니 코드 페이지 , 또는에 나열된 페이지 .

에서 bash(우분투에 기본적으로 설치), 또는 직접 프로그램에서와 : /usr/bin/printf(그러나와 sh의 printf), 유니 코드 문자를 제조 할 수있다 :

$ printf '\u0905'

$ /usr/bin/printf '\u0905'

그러나 코드 포인트 번호에서 나오는 문자는 사용되는 코드 페이지에 따라 여러 바이트 스트림으로 표시 될 수 있습니다.
이는 분명 있어야 \U0905이다 0x09 0x05UTF-16 (UCS-2 등)에서
0x00 0x00 0x09 0x05UTF-32이다.
분명하지는 않지만 utf-8에서는 다음과 같이 표현됩니다 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 진수 코드를 사용하려면 어떻게해야합니까?


이것은 가장 좋은 대답입니다. 쉘에서 유니 코드 포인트 표현 문제를 명확하게 해결하고 16 진수 코드 사이에서 앞뒤로 이동하는 방법을 보여줍니다.
stefano

2

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.