mit sed tabs durch Zeilenumbrüche ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

mit sed tabs durch Zeilenumbrüche ersetzen

Beitrag von blaubaer » 19.08.2003 12:29:11

was muss ich statt "tab" und "Zeilenumbruch" schreiben, damit ich in Textfiles tabs durch Zeilenumbrüche ersetzen kann?

Code: Alles auswählen

cat textfile | sed -e 's/"tab"/"Zeilenumbruch"/'
Blaubär

Benutzeravatar
kleiner_Held
Beiträge: 61
Registriert: 16.07.2002 17:12:08
Wohnort: Dresden
Kontaktdaten:

Beitrag von kleiner_Held » 19.08.2003 12:46:35

Code: Alles auswählen

sed -e 's/\t/\n/'
Gruß

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 19.08.2003 13:18:19

hmm..

Code: Alles auswählen

cat textfile | sed -e 's/\t/\n/g'
liefert leider dasselbe Ergebnis wie ein einfaches

Code: Alles auswählen

cat textfile
Ich suche eine Möglichkeit um aus text_alt ein text_neu zu erzeugen.

Code: Alles auswählen

text_alt:
hello     world

textneu:
hello
world
Blaubär

Benutzeravatar
kleiner_Held
Beiträge: 61
Registriert: 16.07.2002 17:12:08
Wohnort: Dresden
Kontaktdaten:

Beitrag von kleiner_Held » 19.08.2003 14:16:54

Wenn Du die Ersetzungen in die Datei übernehmen willst lautet die Anweisung

Code: Alles auswählen

cat textfile | sed -e 's/\t/\n/g' > textfile
Falls das Trennzeichen nicht immer ein Tab ist, sondern auch Leerzeichen möglich sind,
dann musst Du

Code: Alles auswählen

sed -e 's/\t\| \+/\n/g'
ausführen. Das bedeutet das er sowohl Tabulatoren als auch beliebige Anzahlen von Leehrzeichen durch einen Zeilenumbruch ersetzt.

Gruß

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 19.08.2003 14:20:31

Du kannst entweder perl nehmen

Code: Alles auswählen

perl -p -i -e 's/\t/\n/g;' textfile
, oder aber tr

Code: Alles auswählen

tr '\t' '\n' <textfile >textfile.new
Perl ändert die Datei direkt. Bei tr mußt du die neue Datei danach umbenennen.

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 19.08.2003 14:29:40

komisch, irgendwie klappt das auch nicht :-(
sehr eigenartig ist auch -> wenn ich z.B.

Code: Alles auswählen

cat textfile | sed -e 's/llo/\n/g' > textfile
ausführe sieht das Ergebnis so aus:
hen world
es wird also "llo" durch "n" ersetzt, nicht aber durch einen Zeilenumbruch. Was mache ich falsch??

Blaubär

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 19.08.2003 14:33:55

@ Olaf Dietsche
jo, danke, das klappt jetzt. Wiso ich das mit sed nicht hinbekomme verstehe ich aber nicht.
Blaubär

Olaf Dietsche
Beiträge: 520
Registriert: 12.06.2003 23:18:50
Wohnort: Siegburg

Beitrag von Olaf Dietsche » 19.08.2003 15:10:07

blaubaer hat geschrieben:sehr eigenartig ist auch -> wenn ich z.B.

Code: Alles auswählen

cat textfile | sed -e 's/llo/\n/g' > textfile
ausführe sieht das Ergebnis so aus:
hen world
es wird also "llo" durch "n" ersetzt, nicht aber durch einen Zeilenumbruch. Was mache ich falsch??
Soweit ich weiß erkennt sed \n nur im linken Teil (regex), aber nicht im rechten Teil (replacement). Eventuell funktioniert es, wenn du ein echtes newline einbaust

Code: Alles auswählen

sed -e 's/llo/\
/g' textfile >textfile.new

Benutzeravatar
kleiner_Held
Beiträge: 61
Registriert: 16.07.2002 17:12:08
Wohnort: Dresden
Kontaktdaten:

Beitrag von kleiner_Held » 19.08.2003 15:21:57

blaubaer hat geschrieben:komisch, irgendwie klappt das auch nicht :-(
sehr eigenartig ist auch -> wenn ich z.B.

Code: Alles auswählen

cat textfile | sed -e 's/llo/\n/g' > textfile
ausführe sieht das Ergebnis so aus:
hen world
Hmm, verwendest Du den Befehl eigentlich in nem script, bzw mit welcher shell arbeitest Du ? Obriges Verhalten deutet darauf hin, das ein einfacher \ von der shell weggeschnitten wird, also durch \\ maskiert werden muß. Allerdings sollte es so sein, daß dies innerhalb von Hochkommas nicht nötig ist. Auf alle Fälle sollte es funktionieren, wenn du \ mit \\ ersetzt. Ansonsten hast Du ja noch die Möglichkeiten mit perl bzw tr zu arbeiten.

Gruß

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 19.08.2003 15:36:35

tja, irgendwie wird \ ignoriert. Ich arbeite in der shell (bash).
Aus

Code: Alles auswählen

cat textfile | sed -e 's/llo/\\n/g' > textfile
wird
he\n world
eigenartig :roll:
der Backslash \ ist doch die Taste mit ? und ß, oder
Blaubär

Benutzeravatar
kleiner_Held
Beiträge: 61
Registriert: 16.07.2002 17:12:08
Wohnort: Dresden
Kontaktdaten:

Beitrag von kleiner_Held » 19.08.2003 16:03:52

blaubaer hat geschrieben: Aus

Code: Alles auswählen

cat textfile | sed -e 's/llo/\\n/g' > textfile
wird
he\n world
Naja da war meine Vermutung doch falsch, es kommt schon \n bei sed an aber sed scheint das nicht zu akzeptieren.
Das verwunderliche ist das Dein Beispiel bei mir einwandfrei funktioniert. :-?
Das einzige was mir noch einfällt wäre

Code: Alles auswählen

sed -r -e '...'
wobei -r im man bei mir mit "use extended regular expressions in the script" beschrieben ist.

Achso bei mir ist

Code: Alles auswählen

~$ sed --version
GNU sed version 4.0.7
drauf.

Gruß

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 19.08.2003 16:41:02

auch mit -r bleibt das Ergebnis dasselbe. Version ist :GNU sed version 3.02. Vielleicht liegt es daran. Ich benutze jetzt tr. Trotzdem vielen Dank
Blaubär

Antworten