Comando shell do Linux para grep Unicode Character 'ZERO WIDTH SPACE' (U + 200B)?

5

Como posso usar grep para o caractere Unicode 'ZERO WIDTH SPACE' (U + 200B) no Linux?

$ grep '%U200B' filename?
    
por Dinesh 08.09.2014 / 13:20

2 respostas

5

Primeiro, vamos imprimir um:

$ printf %b '\u200b' | uniname
character  byte       UTF-32   encoded as     glyph   name
        0          0  00200B   E2 80 8B               ZERO WIDTH SPACE

Agora, poderemos usar o mesmo formato para pesquisá-lo (usando o Bash):

$ printf %b '\u200b' | grep -q "$(printf %b '\u200b')"
$ echo $?
0

O truque aqui é que printf %b trata os argumentos como caracteres codificados , assim, você pode usar \x para imprimir caracteres de byte único e \u * para imprimir caracteres de múltiplos bytes.

Para encontrá-lo em um arquivo, basta fazer isso:

grep "$(printf %b '\u200b')" filename

* A especificação POSIX não está clara sobre como %b funciona. A página printf diz "A especificação de conversão% b [...] foi incluída aqui como uma maneira portátil de processar as saídas expandidas em operandos de cadeia de caracteres [...] fornecidos pelo utilitário echo" e the echo page mostra um único exemplo não documentado de seu uso.

Teste:

$ printf %b '\u200b' > test.txt
$ grep -q "$(printf %b '\u200b')" test.txt
$ echo $?
0
    
por 08.09.2014 / 13:49
4

O seguinte, funciona bem. Eu criei o arquivo com o BabelMap (google) e usei a opção save.

O arquivo criado com números numéricos 1-5 e na linha 4 adicionou o espaço zero len:

> hexdump testout.txt -C                 
00000000  31 0a 32 0a 32 0a 33 0a  34 20 e2 80 8b 0a 35 0a  |1.2.2.3.4 ....5.|
00000010

Observe a codificação utf8 do caractere 'e2808b' no arquivo.

Este simples grep encontra a linha correta:

> grep $'\u200b' testout.txt  
4 ​
> grep $'\u200b' testout.txt|hexdump -C
00000000  34 20 e2 80 8b 0a                                 |4 ....|
00000006 

FWIW, minhas GREP_OPTIONS estão definidas: "--color = auto -I -D skip -d skip", mas não acho que nenhuma delas seja relevante.

    
por 08.09.2014 / 17:18

Tags