Estoy usando el siguiente comando para grep rango de juego de caracteres para el código hexadecimal 0900 (en lugar de अ) a 097F (en lugar de व). ¿Cómo puedo usar el código hexadecimal en lugar de अ y व?
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
Me sale el siguiente resultado:
<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>
...
Solo quiero usar código hexadecimal en lugar de अ y व en el comando anterior.
Si el uso del código hexadecimal no es posible, ¿puedo usar unicode en lugar del código hexadecimal para el juego de caracteres ('अ-व')?
Estoy usando Ubuntu 10.04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
fuente
fuente
-v
invierte la coincidencia, de su texto de pregunta parece que no es lo que desea.Respuestas:
Mira esta pregunta .
El texto generalmente está codificado en UTF-8; por lo que debe usar los valores hexadecimales de los bytes utilizados en la codificación utf-8.
y
son equivalentes y realizan una coincidencia basada en la configuración regional (es decir, la coincidencia depende de las reglas de ordenación del script devanagari (es decir, la coincidencia NO es "ningún carácter entre \ u0905 y \ 0935", sino "cualquier cosa que se clasifique entre devanagari") A y devanagari VA "; puede haber diferencias.
Por otro lado, tienes esto (nota -P):
eso hará una coincidencia binaria con esos valores de bytes .
fuente
"["$'
y el sufijo"]"
Si el escape de shell es suficiente, puede usar la
$'\xHH'
sintaxis como esta:¿Es eso suficiente para su caso de uso?
fuente
echo 'अ-व' | hd
me dae0 a4 85 - e0 a4 b5
grep
que no está vinculado con ninguna lib, supongo que no es posible que grep realice la conversión de rango: - /zsh
es capaz de interpretar"\u0900"
y"\u097F"
, pero el comportamiento dependerá de que el rango codificado UTF-8 sea continuo (probablemente lo sea).El valor "hexadecimal"
0x0900
que escribió es exactamente el valor del punto de código UNICODE que también está en hexadecimal.Creo que lo que usted quiere decir es el punto de código Unicode hexadecimal:
U0905
.El carácter en el T-0900 no es la misma que utilizó:
अ
.Ese carácter es U0905 , parte de esta página Unicode , o aparece en esta página .
En
bash
(instalado de manera predeterminada en Ubuntu), o directamente con el programa en:/usr/bin/printf
(pero no consh
printf), se podría generar un carácter Unicode con:Sin embargo, ese carácter, que proviene de un número de punto de código, podría estar representado por varias secuencias de bytes, dependiendo de la página de códigos utilizada.
Debería ser obvio que
\U0905
está0x09 0x05
en UTF-16 (UCS-2, etc.)y
0x00 0x00 0x09 0x05
en UTF-32.Puede que no sea obvio, pero en utf-8 está representado por
0xe0 0xa4 0x85
:Si la configuración regional de su consola es algo similar a
en_US.UTF-8
.Y estoy hablando del shell porque es el que transforma una cadena en lo que recibe la aplicación. Esta:
hace que grep "vea" el personaje que necesita.
Para comprender la línea anterior, puede usar echo:
Luego, podemos construir un rango de caracteres, según lo solicite:
Eso responde a tu pregunta:
fuente
queríamos convertir la comilla doble abierta y la comilla cerrada no ascii en comillas dobles regulares ("). También la comilla simple no ascii en comillas simples regulares (').
para verlos en el archivo (ubuntu bash shell):
TRADUCELOS:
fuente