Saya menggunakan perintah berikut untuk grep rentang set karakter untuk kode heksadesimal 0900 (bukan अ) ke 097F (bukan व). Bagaimana saya bisa menggunakan kode heksadesimal sebagai ganti अ dan व?
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
Saya mendapatkan output berikut:
<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>
...
Saya hanya ingin menggunakan kode heksadesimal alih-alih अ dan व pada perintah di atas.
Jika menggunakan kode heksadesimal sama sekali tidak memungkinkan, dapatkah saya menggunakan unicode alih-alih kode heksadesimal untuk rangkaian karakter ('अ-व')?
Saya menggunakan Ubuntu 10,04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
sumber
sumber
-v
membalikkan kecocokan, dari teks pertanyaan Anda sepertinya bukan itu yang Anda inginkan.Jawaban:
Lihatlah pertanyaan ini .
Teks biasanya dikodekan dalam UTF-8; jadi Anda harus menggunakan hex hex byte yang digunakan dalam utf-8 encoding.
dan
adalah setara, dan mereka melakukan pencocokan berbasis lokal (yaitu, pencocokan bergantung pada aturan penyortiran skrip devanagari (yaitu, pencocokan TIDAK "karakter apa pun antara \ u0905 dan \ 0935" melainkan "penyortiran apa pun antara devanagari A dan devanagari VA "; mungkin ada perbedaan.
Di sisi lain, Anda memiliki ini (catatan-P):
yang akan melakukan pencocokan biner dengan nilai-nilai byte tersebut .
sumber
"["$'
dan sufiks"]"
Jika shell melarikan diri sudah cukup Anda dapat menggunakan
$'\xHH'
sintaksis seperti ini:Apakah itu cukup untuk kasus penggunaan Anda?
sumber
echo 'अ-व' | hd
memberi sayae0 a4 85 - e0 a4 b5
grep
tidak terhubung dengan lib, saya kira itu tidak mungkin untuk memiliki rentang konversi dilakukan oleh grep: - /zsh
mampu menafsirkan"\u0900"
dan"\u097F"
, tetapi perilaku akan bergantung pada rentang UTF-8 yang dikodekan terus menerus (mungkin itu).Nilai "heksadesimal" yang
0x0900
Anda tulis persis dengan nilai titik kode UNICODE yang juga dalam heksadesimal.Saya percaya bahwa apa yang Anda bermaksud mengatakan adalah heksadesimal titik kode UNICODE:
U0905
.Karakter di U-0900 adalah bukan yang Anda digunakan:
अ
.Karakter itu adalah U0905 , bagian dari halaman Unicode ini , atau terdaftar di halaman ini .
Dalam
bash
(diinstal secara default di Ubuntu), atau langsung dengan program di:/usr/bin/printf
(tetapi tidak dengansh
printf), karakter Unicode dapat dihasilkan dengan:Namun, karakter itu, yang berasal dari nomor titik kode dapat diwakili oleh beberapa aliran byte tergantung halaman kode mana yang digunakan.
Seharusnya jelas
\U0905
ada0x09 0x05
di UTF-16 (UCS-2, dll)dan
0x00 0x00 0x09 0x05
di UTF-32.Mungkin tidak jelas tetapi dalam utf-8 diwakili oleh
0xe0 0xa4 0x85
:Jika lokal konsol Anda mirip dengan
en_US.UTF-8
.Dan saya berbicara tentang shell karena shell yang mengubah string menjadi apa yang diterima aplikasi. Ini:
membuat grep "melihat" karakter yang Anda butuhkan.
Untuk memahami baris di atas, Anda dapat menggunakan gema:
Kemudian, kita dapat membangun rentang karakter, seperti yang Anda minta:
Itu menjawab pertanyaan Anda:
sumber
kami ingin mengonversikan kuotasi terbuka non-ascii dan menutup kuotasi ganda menjadi kuotasi ganda reguler ("). Juga kuotasi tunggal non-ascii menjadi kuota tunggal reguler (').
untuk melihatnya di file (ubuntu bash shell):
terjemahkan mereka:
sumber