Wie kann ich mit sed U + 200B (Leerzeichen ohne Breite) löschen?

15

Ich habe eine sehr große Datei, die über alle Bereiche der Breite Null verteilt ist. Das Öffnen und Bearbeiten mit dauert zu lange, vidaher möchte ich alle Instanzen des Zeichens mit löschen sed. Das Problem ist, ich kann nicht herausfinden, wie ich den Charakter anpassen soll! Ich habe versucht mit \u200B, \x{200b}. Irgendwelche Ideen?

Ich verwende CentOS 5, wenn das überhaupt hilft.

Thetaiko
quelle
Unterstützt Ihre sed-Kopie die Unicode-Codierung, mit der die Datei codiert ist? Wenn nicht, gibt es wahrscheinlich keine gute Möglichkeit, es richtig mit sed zu machen, und Sie sollten besser ein Python-Skript oder so etwas verwenden ...
4.
@JanC - in der Tat bin ich mit Python gegangen. Die Datei ist mit utf8 verschlüsselt, scheint Standard genug zu sein, dass alles in der Lage sein sollte, sie zu verarbeiten. Ich habe mein Python-Skript unten hinzugefügt, falls es für irgendjemanden nützlich ist.
Thetaiko

Antworten:

11

Das scheint bei mir zu funktionieren:

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

Demonstration:

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

Bearbeiten:

Teilweise basierend auf Gilles 'Antwort:

tr -d $(/usr/bin/printf "\u200b") < inputfile
Bis auf weiteres angehalten.
quelle
Perfekt - genau das habe ich gesucht. Tatsächlich habe ich \xe2\x80\x8bbeim Betrachten einiger Beispielzeichenfolgen in Python den gleichen Zeichensatz ( ) bemerkt . Vielen Dank!
Thetaiko
4

Das Verhalten von GNU sed mit UTF-8 scheint nicht sehr klar zu sein. Experimentell können Sie festlegen, dass die Bytes der UTF-8-Darstellung ersetzt werden:

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

Alternativ können Sie das Zeichen in Ihre Shell eingeben und einen der Standardbefehle in einem UTF-8-Gebietsschema verwenden:

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

In zsh können Sie das Zeichen auch über eine Escape-Sequenz eingeben:

<old tr -d $'\u200B' >new
Gilles 'SO - hör auf böse zu sein'
quelle
Ab Bash 4.2 sind Unicode - Sequenzen unterstützt echo -e, printfFormatstrings und ANSI Strings in Anführungszeichen (zB echo -e '\u1E4F', printf '\u01DD %s\n' 'X', mkdir $'\u0250)
Pausiert bis auf weiteres.
0

Nun, es sei denn, jemand hat irgendwelche Ideen, wie man seddas macht (was mich übrigens immer noch interessiert), es ist Python zur Rettung ...

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()
Thetaiko
quelle
2
Wenn Sie nach den großen Kanonen greifen wollen, wie wäre es dann mit den viel einfacheren perl -C -pe 's/\x{200B}//g'?
Gilles 'SO- hör auf böse zu sein'
+1 an die Gilles, die auch unter Mac OSX funktioniert. perl -C -pi.bak -e 's/\x{200B}//g' yourfileErgebnisse in Ihrer Datei behoben und eine Sicherung in yourfile.bak
MarkHu