Wie kann ich ungerade Bytes aus dieser Ausgabe entfernen?

154
Arvandor

Für meinen Statistikkurs habe ich viel Linux-Tricks benutzt, um meine Zahlen zu organisieren, sie zu kopieren / einzufügen usw. Jetzt hatte ich bis vor kurzem keine Probleme ... Ich hatte eine Kopie eingefügt eine Reihe von Werten aus Open Office (könnte der Schuldige sein) und versuchte, sie so zu formatieren ...

echo "5  8  6  25  4  21  10  1  24  12  4  16   9  2  12  28  14  17  12  1  16  18  18  3   12  6  6  12  10  20  9  6  8  6  8  15" | sed 's/\s\+/\n/g' | grep -v ^$ | sed 's/[[:space:]]*$//g' > test.txt 

Dies würde jede Zahl in eine eigene Zeile schreiben, aber als ich sie in statdisk einfügte, bekam ich einige ungültige Zeichenfehler. Es schien, als wäre es ein Leerzeichen, aber ich habe versucht, sed und tr mit Variationen von [: space:], [: blank:] und anderen Dingen wie s / [\ t] * $ // g zu verwenden, um zu versuchen, das zu entfernen, was gerade nachläuft am Ende (was ich in Vim gut löschen könnte). Aber auf der CLI funktionierte nichts.

Das Ausführen eines Hexdumps für diese Datei gibt mir einen Eindruck

5 � � \n 8 � � \n 6 � � \n 2 5 � � 

Was zum Teufel sind das? Hexdump -C

35 c2 a0 0a 38 c2 a0 0a 36 c2 a0 0a 32 35 c2 a0 |5...8...6...25..| 

Hat jemand eine Idee, was diese c2 a0 Bytes sind? Gibt es eine einfache / elegante Möglichkeit, sie mit sed oder tr oder so zu bombardieren? Oder wenn ich kein Ascii bin, müsste ich etwas Bytemanipulationen machen ... Irgendwelche Gedanken / Vorschläge?

1
Sind die seltsamen Zeichen in Ihrer OpenOffice-Ausgabedatei? Ich erinnere mich, dass Calc ziemlich gut bei einigen Zahlen war, aber ich weiß nicht, ob es ein `sed` Interface / Plugin hat Xen2050 vor 8 Jahren 0

1 Antwort auf die Frage

1
4ae1e1

c2a0ist UTF-8 U + 00A0, NO-BREAK SPACE. Sie können sie leicht trzum Entfernen verwenden, z.

> echo -n $'5\u00a0 8\u00a0 6' | tr -d $'\u00a0' | xxd 00000000: 3520 3820 36 5 8 6 

Beachten Sie, dass die \uFlucht nur in Bash 4.2+ funktioniert, aber Sie könnten dies natürlich auch ersetzen $'\xc2\xa0'.

Was macht der $ String? Ich kenne $ (command) für die Befehlsersetzung, die den deklassierten Backtick ersetzt, aber ich kenne den Unterschied zwischen $ '\ u00a0' und "\ u00a0" nicht. Arvandor vor 8 Jahren 0
ANSI-C-Quotierung. https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting. 4ae1e1 vor 8 Jahren 0
Aha, danke dafür. Es scheint mir, als würden viele Dienstprogramme dies automatisch tun? Gut zu wissen, dass ich es in der Shell richtig machen kann, für Dienstprogramme, die sie möglicherweise nicht richtig analysieren. Arvandor vor 8 Jahren 0
Ich bin mir nicht sicher, was Sie mit "viele Dienstprogramme automatisch tun" meinen. Von welchen Dienstprogrammen sprichst du? Beispiel? Zumindest die Standard * ix-Dienstprogramme sollten U + 00A0 nicht anders behandeln als andere zufällige Codepunkte. Die POSIX-Leerzeichenklasse im vollständigen Unicode-Bereich kann dieses Zeichen enthalten. Dies ist jedoch so weit, wie besonders es ist. 4ae1e1 vor 8 Jahren 0
Übrigens, löst diese Antwort Ihr Problem? Wenn ja, können Sie es akzeptieren. Wenn nicht, sagen Sie genau, was Sie wollen. 4ae1e1 vor 8 Jahren 0
Ich habe versucht, es zu akzeptieren, da es funktioniert (ich musste die / xc2 / xa0-Version ausführen), aber ich habe noch nicht genug Wiederholung hier = / Und mit "viele Dienstprogramme tun dies automatisch" meine ich das normalerweise wann Ich tippe Dinge wie \ n oder \ t, sie werden als Newline- oder Horizontal-Tab erkannt, ohne dass ich $ '\ n' oder was auch immer tun muss. Arvandor vor 8 Jahren 0
Als ich mich über sed vorgelesen hatte, entdeckte ich einen Trick, an den ich gedacht hätte, dass er funktionieren könnte ... Wenn ich `sed -r 's / ([0-9] +) (. *) / \ 1 / g'` mache, um nur das zu finden Zahlen, und drucken Sie diese, ohne etwas anderes zu berücksichtigen, das in der Zeile übereinstimmt. Es bleiben jedoch die Leerstellen, wenn ich es so versuche. Irgendeine Idee, warum das sein kann? Arvandor vor 8 Jahren 0
Sie brauchen keinen Mitarbeiter, der eine Antwort auf * Ihre * Frage akzeptiert ... (Und Sie können keine Antwort auf die Fragen anderer Personen annehmen, ganz gleich, was Ihre Vertreter sind.) Links neben der Antwort ist ein Haken gesetzt . Klicken Sie das an. 4ae1e1 vor 8 Jahren 0
Re sed: Ihre Regex bedeutet nicht, was Sie wahrscheinlich bedeuten sollen. Versuchen Sie es unter https://regex101.com/, um zu erfahren, was es wirklich tut. Was Sie verwenden können, ist `sed -r 's / ([[: digit:]] +) [^ [: digit:]] + / \ 1 / g'` 4ae1e1 vor 8 Jahren 0
Um es Ihnen noch einfacher zu machen: Hier ist die Erklärung Ihres Regex: https://regex101.com/r/gO0aK2/1. Und hier ist meins: https://regex101.com/r/gO0aK2/2. 4ae1e1 vor 8 Jahren 0
Aha, nochmals vielen Dank für diese Ressourcen. Ich habe anscheinend versucht, Ihre Antwort "zu bestätigen", sie nicht anzunehmen, also den Wiederholungsfehler. Derp. Arvandor vor 8 Jahren 0
Anscheinend habe ich einen Ihrer früheren Kommentare über Dienstprogramme vermisst. Nein, das ist anders. Wenn Sie ein Leerzeichen in die Befehlszeile eingeben, wird es nicht als Leerzeichen behandelt. Die einzigen Leerzeichen sind SPACE, TAB, LF und CR. Sicherlich können Sie Ihr Worttrennzeichen IFS neu definieren, um Unicode-Leerzeichen aufzunehmen. Dies ist jedoch nicht die Standardeinstellung und wird nicht empfohlen. Es hilft auch hier nicht, da die Leerzeichen in doppelten Anführungszeichen stehen. 4ae1e1 vor 8 Jahren 0