J'utilise la commande suivante pour grep plage de jeux de caractères pour le code hexadécimal 0900 (au lieu de अ) à 097F (au lieu de व). Comment puis-je utiliser du code hexadécimal à la place de अ et व?
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
J'obtiens la sortie suivante:
<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>
...
Je veux juste utiliser du code hexadécimal au lieu de अ et व dans la commande ci-dessus.
Si l'utilisation du code hexadécimal n'est pas du tout possible, puis-je utiliser unicode au lieu du code hexadécimal pour le jeu de caractères ('अ-व')?
J'utilise Ubuntu 10.04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
la source
la source
-v
Inverse également la correspondance, à partir du texte de votre question, il semble que ce ne soit pas ce que vous voulez.Réponses:
Regardez cette question .
Le texte est généralement codé en UTF-8; vous devez donc utiliser les valeurs hexadécimales des octets utilisés dans le codage utf-8.
et
sont équivalents, et ils effectuent une correspondance basée sur les paramètres régionaux (c'est-à-dire que la correspondance dépend des règles de tri du script devanagari (c'est-à-dire que la correspondance n'est PAS "un caractère entre \ u0905 et \ 0935") mais plutôt "tout tri entre devanagari" A et devanagari VA "; il peut y avoir des différences.
En revanche, vous avez ceci (note -P):
qui fera une correspondance binaire avec ces valeurs d' octets .
la source
"["$'
et le suffixe"]"
Si l'échappement du shell est suffisant, vous pouvez utiliser la
$'\xHH'
syntaxe comme ceci:Est-ce suffisant pour votre cas d'utilisation?
la source
echo 'अ-व' | hd
me donnee0 a4 85 - e0 a4 b5
grep
n'est lié à aucune lib, je suppose qu'il n'est pas possible de faire effectuer la conversion de plage par grep: - /zsh
est capable d'interpréter"\u0900"
et"\u097F"
, mais le comportement dépendra de la plage codée UTF-8 étant continue (c'est probablement le cas).La valeur "hexadécimale" que
0x0900
vous avez écrite est exactement la valeur du point de code UNICODE qui est également en hexadécimal.Je crois que ce que vous voulez dire est le hexadécimal point de code UNICODE:
U0905
.Le caractère U-0900 est pas celui que vous utilisez:
अ
.Ce caractère est U0905 , faisant partie de cette page Unicode , ou répertorié sur cette page .
Dans
bash
(installé par défaut dans Ubuntu), ou directement avec le programme à:/usr/bin/printf
(mais pas avecsh
printf), un caractère Unicode pourrait être produit avec:Cependant, ce caractère, qui provient d'un numéro de point de code, pourrait être représenté par plusieurs flux d'octets en fonction de la page de code utilisée.
Il devrait être évident que
\U0905
c'est0x09 0x05
en UTF-16 (UCS-2, etc.)et
0x00 0x00 0x09 0x05
en UTF-32.Ce n'est peut-être pas évident, mais dans utf-8, il est représenté par
0xe0 0xa4 0x85
:Si les paramètres régionaux de votre console sont similaires
en_US.UTF-8
.Et je parle du shell parce que c'est celui qui transforme une chaîne en ce que l'application reçoit. Cette:
fait grep "voir" le caractère dont vous avez besoin.
Pour comprendre la ligne ci-dessus, vous pouvez utiliser l'écho:
Ensuite, nous pouvons construire une plage de caractères, comme vous le demandez:
Cela répond à votre question:
la source
nous voulions convertir les guillemets ouverts non ascii et fermer les guillemets doubles en guillemets doubles normaux ("). De même, le guillemet simple non ascii en guillemets simples réguliers (').
pour les voir dans le fichier (ubuntu bash shell):
les traduire:
la source