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.


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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.