sed will keinen tab löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

sed will keinen tab löschen

Beitrag von roli » 28.07.2011 11:39:35

Hallo,

sed macht mich irre ...
Ich habe eine Datei (hier im Beispiel mit Namen "3"), die Leerzeichen und Tabs (einen) enthält, also alle "Whitespaces", die ich gerne via Script entsorgen möchte.
Die Leerzeichen sind kein Thema, den Tab aber erwische ich nicht:

Code: Alles auswählen

$ cat 3
0;2       ;0
$ od -x 3
0000000 303b 3209 2020 3b30 0a00
0000011
$ sed -e 's/[ \t]*//g' 3|od -x
0000000 303b 3209 3b30 0a00
0000007
$ sed -e 's/\t//g' 3 |od -x
0000000 303b 3209 2020 3b30 0a00
0000011
$ sed -e 's/\x09//g' 3 |od -x
0000000 303b 3209 2020 3b30 0a00
0000011
$
Was mache ich falsch?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: sed will keinen tab löschen

Beitrag von Livingston » 28.07.2011 12:06:39

Ich habe Dein Problem genau nachgestellt, kriege aber das, was Du suchst:

Code: Alles auswählen

$ cat 3
0;2       ;0
cat 3|od -x
0000000 3b30 0932 2020 303b 000a
$ sed -e 's/[ \t]*//g' 3
0;2;0
$ sed -e 's/[ \t]*//g' 3|od -x
0000000 3b30 3b32 0a30
Es fällt auf, dass od -x die Byteorder umdreht. Stellt sich mir die Frage, mit welchem System Du arbeitest.

Code: Alles auswählen

sed --version
GNU sed-Version 4.2.1
Es kann sein, das nonGNU sed-Versionen kein \t kennen. Dass \x09 den Job nicht macht, bringt mich allerdings auch ins Grübeln.

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: sed will keinen tab löschen

Beitrag von roli » 28.07.2011 13:43:22

Livingston hat geschrieben:Stellt sich mir die Frage, mit welchem System Du arbeitest.

Code: Alles auswählen

sed --version
GNU sed-Version 4.2.1
HP-UX 11i Version 2: August 2003
HP-UX adeagich B.11.23 U ia64

Code: Alles auswählen

$ sed --version
sed: illegal option -- -
Usage: sed [-n] [-e script] [-f source_file] [file...]
Livingston hat geschrieben:Es kann sein, das nonGNU sed-Versionen kein \t kennen. Dass \x09 den Job nicht macht, bringt mich allerdings auch ins Grübeln.
Mich auch ...
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: sed will keinen tab löschen

Beitrag von roli » 28.07.2011 14:00:16

Jetzt wird's seltsam ...
Ich habe eine Loesung, verstehe sie aber nicht:

Code: Alles auswählen

$ cat 3
0;2       ;0
$ od -x 3
0000000 303b 3209 2020 3b30 0a00
0000011
$ cat 3  | tr -d '\011'
0;2  ;0
$ cat 3  | tr -d '\011' |od -x
0000000 303b 3220 203b 300a
0000010
Wieso wird \x09 gelöscht, wenn ich \011 mittels tr lösche?
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
hikaru
Moderator
Beiträge: 13917
Registriert: 09.04.2008 12:48:59

Re: sed will keinen tab löschen

Beitrag von hikaru » 28.07.2011 14:09:56

Im Gegensatz zu Linux auf x86 ist HP-UX big-endian, was die \t-Sequenz beeinflussen dürfte. Keine Ahnung ob das die Ursache für das Problem ist und falls ja, wie die Erkenntnis im konkreten Fall weiter hilft, aber ich erinnere mich an hässliche Lese-Präprozessoren für den Austausch von Binärdaten zwischen x86- und SPARC-Linuxen.

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: sed will keinen tab löschen

Beitrag von roli » 28.07.2011 14:23:38

Das könnte es sein ...
Im Moment bin ich erstmal froh das ich eine Lösung habe, auch wenn ich sie noch nicht wirklich verstehe. Mal sehen wann ich dazu Zeit finde.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed will keinen tab löschen

Beitrag von Meillo » 29.07.2011 19:45:48

Um das Problem mal ganz direkt zu loesen: Gebe den Tab doch einfach direkt ein, statt auf die Metadarstellung zurueckzugreifen. Das mag zwar schwerer lesbar sein oder durch manche Editoren kaputt gemacht werden, funktioniert aber AFAIK mit allen sed(1)s.

Die Zeichenklasse [\t] matched in den meisten Implementierungen den Backslash und das kleine `t'. Teste einfach mal Eingabedaten die diese Zeichen enthalten.

Ansonsten ist tr(1) (wurde ja schon vorgeschlagen) der straight-forward Ansatz. tr(1) kennt AFAIK auch in jeder Version `\t'.

Wenn ihr od(1) verwendet, dann bitte mit `-bc', dann ist die Ausgabe naemlich auch lesbar. ;-) Zeichenescapes werden meiner Erfahrung nach auch haeufiger oktal als hexadezimal unterstuetzt.

Der ASCII-Tab ist oktal 11 und hex 9. Als Escapesequenzen ist das dann oft `\011' (evtl. auch `\o011') und `\x9' (`\x09'). tr(1) kennt die Notation `\11' (`\011'). sed(1) scheint `\o11' und `\x9' zu kennen, aber nur bei gsed und ssed.

Als portable Empfehlung: Entweder tr(1) verwenden oder bei sed(1) den Tab direkt eingeben.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: sed will keinen tab löschen

Beitrag von Meillo » 29.07.2011 19:53:41

hikaru hat geschrieben:Im Gegensatz zu Linux auf x86 ist HP-UX big-endian, was die \t-Sequenz beeinflussen dürfte.
Nein.
Use ed once in a while!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: sed will keinen tab löschen

Beitrag von roli » 01.08.2011 16:17:00

Meillo hat geschrieben:Wenn ihr od(1) verwendet, dann bitte mit `-bc', dann ist die Ausgabe naemlich auch lesbar. ;-) Zeichenescapes werden meiner Erfahrung nach auch haeufiger oktal als hexadezimal unterstuetzt.
Danke, das "c" bringt's:

Code: Alles auswählen

$ od -xc 3
0000000    303b    3209    2020    3b30    0a00
          0   ;   2  \t           ;   0  \n
0000011
$ od -bc 3
0000000   0   ;   2  \t           ;   0  \n
        060 073 062 011 040 040 073 060 012
0000011
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Antworten