Como posso excluir U + 200B (espaço de largura zero) usando sed

14

Eu tenho um arquivo muito grande que tem espaços de largura zero espalhados por toda parte. Demora muito para abrir e editar usando vi , então gostaria de excluir todas as instâncias do caractere usando sed . O problema é que não consigo descobrir como combinar com o personagem! Eu tentei usar \u200B , \x{200b} . Alguma idéia?

Estou rodando o CentOS 5 se isso ajudar em tudo.

    
por thetaiko 04.11.2010 / 21:33

3 respostas

11

Isso parece funcionar para mim:

sed 's/\xe2\x80\x8b//g' inputfile

Demonstração:

$ /usr/bin/printf 'X\u200bY\u200bZ' | hexdump -C
00000000  58 e2 80 8b 59 e2 80 8b  5a                       |X...Y...Z|
$ /usr/bin/printf 'X\u200bY\u200bZ' | sed 's/\xe2\x80\x8b//g' | hexdump -C
00000000  58 59 5a                                          |XYZ|

Editar:

Baseada parcialmente na resposta de Gilles:

tr -d $(/usr/bin/printf "\u200b") < inputfile
    
por 04.11.2010 / 23:23
4

O comportamento do GNU sed com o UTF-8 não parece estar muito bem definido. Experimentalmente, você pode substituir os bytes da representação UTF-8:

<old sed 's/\xe2\x80\e8b//g' >new

Como alternativa, você pode digitar o caractere no seu shell e usar qualquer um dos comandos padrão em um código do idioma UTF-8:

<old tr -d '​' >new
<old sed 's/​//g' >new

No zsh, você também pode inserir o caractere por meio de uma sequência de escape:

<old tr -d $'\u200B' >new
    
por 04.11.2010 / 23:50
0

Bem, a menos que alguém tenha alguma idéia de como obter sed para fazer isso (o que eu ainda estou interessado, a propósito) seu Python para o resgate ...

import sys, re
pattern = re.compile(u"\u200b")
f = open(sys.stdin, "rb")
for line in f:
    a = pattern.sub("", line.decode("utf8"))
    print a.encode("utf8"),
f.close()
    
por 04.11.2010 / 22:41