Como especificar caracteres usando códigos hexadecimais em 'grep'?

22

Estou usando o seguinte comando para grep character set range para o código hexadecimal 0900 (em vez de अ) para 097F (em vez de व). Como posso usar o 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 o código hexadecimal em vez de अ e व no comando acima.

Se não for possível usar o código hexadecimal, posso usar unicode em vez de código hexadecimal para o conjunto de caracteres ('अ-व')?

Estou usando o Ubuntu 10.04

    
por Dhrubo Bhattacharjee 26.08.2011 / 08:03

4 respostas

19

Veja esta questão .

O texto geralmente é codificado em UTF-8; então você tem que usar os valores hexadecimais dos bytes usados na codificação utf-8.

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

e

grep '[अ-व]'

são equivalentes, e eles realizam uma correspondência baseada no código de idioma (ou seja, a correspondência depende das regras de classificação do script devanagari (isto é, a correspondência é NÃO "qualquer caractere entre \ u0905 e \ 0935 "mas em vez disso" qualquer coisa que se classifique entre devanagari A e devanagari VA "; pode haver diferenças.

Por outro lado, você tem isso (nota -P):

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

que fará uma correspondência binária com os valores byte .

    
por 04.03.2013 / 04:06
6

Se o shell escape for suficiente, você pode usar a sintaxe $'\xHH' desta forma:

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

Isso é suficiente para o seu caso de uso?

    
por 26.08.2011 / 15:57
3

O valor "hexadecimal" 0x0900 que você escreveu é exatamente o valor do ponto de código UNICODE que também está em hexadecimal.

hexadecimal code 0900 (instead of अ)

Acredito que o que você quer dizer é o ponto de código hexadecimal UNICODE: U0905 .

O caractere na U-0900 não é o que você usou: .
Esse personagem é U0905 , parte de esta página Unicode , ou listado em esta página .

Em bash (instalado por padrão no Ubuntu) ou diretamente com o programa em: /usr/bin/printf (mas não com sh printf), um caractere Unicode poderia ser produzido com:

$ printf '\u0905'
अ
$ /usr/bin/printf '\u0905'
अ

No entanto, esse caractere, que vem de um número de ponto de código, pode ser representado por vários fluxos de bytes, dependendo de qual página de código é usada.
Deve ser óbvio que \U0905 é 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 :

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

Se a localidade do seu console for algo semelhante a en_US.UTF-8 .

E eu estou falando sobre o shell, porque é o que transforma uma string em que o aplicativo recebe. Isso:

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

faz grep "ver" o personagem que você precisa.
Para entender a linha acima, você pode usar o echo:

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

Em seguida, podemos criar um intervalo de caracteres, conforme você solicita:

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

Isso responde à sua pergunta:

How I can use hexadecimal code in place of अ and व?

    
por 30.11.2016 / 05:34
2

queremos converter as aspas duplas abertas não ascii e fechar aspas duplas para as aspas duplas regulares ("). Também a aspa simples não-ascii para aspas simples regulares (').

para vê-los no arquivo (shell bash do ubuntu):

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

traduza-os:

$ /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
    
por 15.06.2013 / 07:15