Come posso eliminare U + 200B (spazio a larghezza zero) usando sed


15

Ho un file molto grande con spazi a larghezza zero sparsi ovunque. Ci vuole troppo tempo per aprirlo e modificarlo usando, viquindi mi piacerebbe eliminare tutte le istanze del personaggio usando sed. Il problema è che non riesco a capire come abbinare il personaggio! Ho provato ad utilizzare \u200B, \x{200b}. Qualche idea?

Sto usando CentOS 5 se questo aiuta a tutti.


La tua copia di sed supporta la codifica Unicode con cui il file è codificato? Altrimenti probabilmente non c'è un buon modo per farlo correttamente con sed, e faresti meglio a usare uno script Python o qualcosa del genere ...
JanC

@ JanC - in effetti, sono andato con Python. Il file è codificato con utf8, sembra abbastanza standard da consentire a qualsiasi cosa di elaborarlo. Ho aggiunto il mio script Python di seguito, nel caso sia utile a chiunque.
thetaiko,

Risposte:


11

Questo sembra funzionare per me:

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

Dimostrazione:

$ /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|

Modificare:

Basato parzialmente sulla risposta di Gilles:

tr -d $(/usr/bin/printf "\u200b") < inputfile

Perfetto - questo è esattamente quello che stavo cercando. In effetti, ho notato lo stesso set di caratteri ( \xe2\x80\x8b) guardando alcune stringhe di esempio in Python. Grazie!
thetaiko,

4

Il comportamento di GNU sed con UTF-8 non sembra essere ben definito. Sperimentalmente, puoi farlo sostituire i byte della rappresentazione UTF-8:

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

In alternativa, è possibile digitare il carattere nella shell e utilizzare uno qualsiasi dei comandi standard in una locale UTF-8:

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

In zsh, puoi anche inserire il personaggio attraverso una sequenza di escape:

<old tr -d $'\u200B' >new

Come di Bash 4.2, sequenze Unicode sono supportati da echo -e, printfstringhe di formato e ANSI citato stringhe (ad esempio echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
In pausa fino a nuovo avviso.

0

Bene, a meno che nessuno abbia qualche idea su come arrivare seda questo (che mi interessa ancora, a proposito) il suo Python in soccorso ...

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()

2
Se hai intenzione di prendere le pistole grandi, che ne dici di molto più semplice perl -C -pe 's/\x{200B}//g'?
Gilles 'SO- smetti di essere malvagio' il

+1 per Gilles, che funziona anche su Mac OSX. perl -C -pi.bak -e 's/\x{200B}//g' yourfilerisulta risolto il tuo file e un backup in yourfile.bak
MarkHu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.