Grep`de onaltılık kodları kullanarak karakterleri nasıl belirleyebilirim?


27

Onaltılık kod 0900 (अ yerine) ile 097F (व yerine) karakter kümesi aralığını greplemek için aşağıdaki komutu kullanıyorum. Onaltılık kodu अ ve व yerine nasıl kullanabilirim?

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

Aşağıdaki çıktıyı alıyorum:

    <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> 
    ...

Sadece yukarıdaki komutta अ ve व yerine onaltılık kod kullanmak istiyorum.

Onaltılık kod kullanmak hiç mümkün değilse, karakter kümesi için onaltılı kod yerine unicode kullanabilir miyim ('अ-व')?

Ubuntu 10.04 kullanıyorum


1
"Çalışmamak" derken ne demek istiyorsun? Ayrıca -vmaçı ters çevirir, soru metninizden istediğiniz gibi görünmüyor.
Christian.K

@ Christian.K Gecikme için üzgünüm ... Soruyu düzelttim, lütfen bir göz atın.

Hala uygun bir cevap bekliyorum. :(
Dhrubo Bhattacharjee

Yanıtlar:


21

Bu soruya bak .

Metin genellikle UTF-8 ile kodlanmıştır; bu yüzden utf-8 kodlamasında kullanılan baytların onaltılık değerlerini kullanmalısınız.

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

ve

grep '[अ-व]'

eşdeğerdir ve onlar olduğunu, eşleştirme (olduğu, eşleştirme edilir Devanagarca script sıralama kurallarına bağlıdır (bir yerel bazlı eşleştirme gerçekleştirmek DEĞİL ancak bunun yerine "\ u0905 ve \ 0935 arasında herhangi bir karakter" "şey devanagari arasındaki sıralama A ve devanagari VA "; farklılıklar olabilir.

Öte yandan, bu (not -P) var:

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

Bu byte değerleri ile ikili bir eşleştirme yapacaktır .


2
Lütfen ön eki "["$'ve soneki açıklayın"]"
Jonathan Komar

6

Kabuk kaçması yeterliyse, aşağıdaki $'\xHH'gibi sözdizimini kullanabilirsiniz :

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

Bu senin kullanım durumun için yeterli mi?


echo 'अ-व' | hdbana verire0 a4 85 - e0 a4 b5
enzotib

Nitekim OP, UTF-8 kodlamasında onaltılı dökümleri değil, unicode değerlerini vermiştir: - / grepHerhangi bir lib ile bağlantılı olmadığından, aralık dönüşümünün grep ile gerçekleştirilmesi mümkün değildir sanırım: - /
Stéphane Gimenez

1
Btw, zshyorumlayabiliyor "\u0900"ve "\u097F"ancak davranış sürekli UTF-8 kodlu aralığına bağlı olacak (muhtemelen öyle).
Stéphane Gimenez

Grep yok -v "<[" $ '\ x09 \ x00' "-" $ '\ x09 \ x7F' "] * \ s", <wf = "16929"> x </w> <wf = "çıkışını verir 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> .... Bu beklenemez. :(, Onaltılık kod veya karakter kümesi ('अ-व') yerine unicode kullanabilir miyim?
Dhrubo Bhattacharjee

6

0x0900Yazdığınız "onaltılık" değeri tam olarak onaltılık olan UNICODE kod noktasının değeridir.

onaltılık kod 0900 (अ yerine)

Ben ne demek onaltılık UNICODE kod noktası olduğuna inanıyoruz: U0905.

U-0900 de karakter kullandığınız biri değil: .
Bu karakter U0905 , bu Unicode sayfasının bir parçası veya bu sayfada listelenmiştir .

In bash(Ubuntu varsayılan olarak yüklenir) veya doğrudan programda ile: /usr/bin/printf(ama ile shprintf), bir Unicode karakter ile üretilmiş olabilir:

$ printf '\u0905'

$ /usr/bin/printf '\u0905'

Bununla birlikte, bir kod noktası numarasından gelen bu karakter, hangi kod sayfasının kullanıldığına bağlı olarak birkaç bayt akışı ile temsil edilebilir.
O açık olmalı \U0905olan 0x09 0x05UTF-16 (UCS-2, vb)
ve 0x00 0x00 0x09 0x05UTF-32.
Açık olmayabilir ama utf-8'de aşağıdakiler ile temsil edilir 0xe0 0xa4 0x85:

$ /usr/bin/printf '\u0905' | od -vAn -tx1
e0 a4 85

Konsolunuzun yerel ayarına benzer bir şey varsa en_US.UTF-8.

Ve ben kabuktan bahsediyorum çünkü uygulamanın aldığı şeye dize dönüştüren odur. Bu:

grep "$(printf '\u0905')" file

grep'i ihtiyacınız olan karakteri "görmenizi" sağlar.
Yukarıdaki satırı anlamak için yankı kullanabilirsiniz:

$ echo grep "$(printf '\u0905')" file
grep  file

Ardından, istediğiniz gibi bir karakter aralığı oluşturabiliriz:

$ echo grep "$(printf '[\u0905-\u097f]')" file
grep [अ-ॿ] file

Bu sorunuza cevap veriyor:

Onaltılık kodu अ ve व yerine nasıl kullanabilirim?


Bu, şu ana kadarki en iyi cevaptır - unicode noktalarının kabuktaki temsilleri sorununu açıkça ele alır ve aralarında onaltılık kodlar arasında nasıl ileri gidileceğini gösterir.
stefano

2

ascii olmayan açık ikili alıntıyı ve çiftli alıntıyı normal çift tırnaklara (") dönüştürmek istedik.

onları dosyada görmek için (ubuntu bash kabuğu):

$ grep -P "\x92" infile.txt  (single)
$ grep -P "\x93" infile.txt  (open double)
$ grep -P "\x94" infile.txt  (close double)

onları Çevir:

$ /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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.