Eu estou usando o seguinte comando para grep intervalo de conjunto de caracteres para o código hexadecimal 0900 (em vez de) para 097F (em vez de). Como posso usar código hexadecimal no lugar de अ e व?
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
Eu recebo a seguinte saída:
<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>
...
Eu só quero usar código hexadecimal em vez de अ e व no comando acima.
Se o uso do código hexadecimal não for possível, posso usar o código unicode em vez do código hexadecimal para o conjunto de caracteres ('अ-व')?
Estou usando o Ubuntu 10.04
shell
grep
character-encoding
unicode
Dhrubo Bhattacharjee
fonte
fonte
-v
inverte a correspondência, pelo texto da sua pergunta parece que não é o que você deseja.Respostas:
Olhe para esta pergunta .
O texto geralmente é codificado em UTF-8; então você deve usar os valores hexadecimais dos bytes usados na codificação utf-8.
e
são equivalentes e executam uma correspondência baseada em código de idioma (ou seja, a correspondência depende das regras de classificação do script devanagari (ou seja, a correspondência NÃO é "qualquer caractere entre \ u0905 e \ 0935", mas "qualquer coisa que seja classificada entre devanagari A e devanagari VA "; pode haver diferenças.
Por outro lado, você tem este (nota -P):
que fará uma correspondência binária com esses valores de bytes .
fonte
"["$'
e sufixo"]"
Se o escape de shell for suficiente, você poderá usar a
$'\xHH'
sintaxe da seguinte maneira:Isso é suficiente para o seu caso de uso?
fonte
echo 'अ-व' | hd
me dáe0 a4 85 - e0 a4 b5
grep
não está relacionada com qualquer lib, eu acho que não é possível ter a conversão gama ser realizada por grep: - /zsh
é capaz de interpretar"\u0900"
e"\u097F"
, mas o comportamento dependerá do intervalo codificado em UTF-8 ser contínuo (provavelmente é).O valor "hexadecimal" que
0x0900
você escreveu é exatamente o valor do ponto de código UNICODE, que também está em hexadecimal.Eu acredito que o que você quer dizer é o ponto de código Unicode hexadecimal:
U0905
.O personagem de U-0900 não é o que você usou:
अ
.Esse caractere é U0905 , parte desta página Unicode ou listado nesta página .
Em
bash
(instalado por padrão no Ubuntu) ou diretamente com o programa em:/usr/bin/printf
(mas não comsh
printf), um caractere Unicode pode ser produzido com:No entanto, esse caractere, proveniente de um número de ponto de código, pode ser representado por vários fluxos de bytes, dependendo da página de código usada.
Deveria ser óbvio que
\U0905
está0x09 0x05
em UTF-16 (UCS-2, etc)e
0x00 0x00 0x09 0x05
em UTF-32.Pode não ser óbvio, mas no utf-8 é representado por
0xe0 0xa4 0x85
:Se a localidade do seu console for algo semelhante a
en_US.UTF-8
.E eu estou falando sobre o shell, porque é aquele que transforma uma string no que o aplicativo recebe. Este:
faz grep "ver" o personagem que você precisa.
Para entender a linha acima, você pode usar echo:
Em seguida, podemos criar um intervalo de caracteres, conforme solicitado:
Isso responde sua pergunta:
fonte
queríamos converter as aspas duplas não-ascii abertas e as aspas duplas em aspas duplas regulares ("). Também as aspas simples não-ascii em aspas simples regulares (').
para vê-los no arquivo (ubuntu bash shell):
traduza-os:
fonte