PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed-Problem: mehrere Zeilen --> eine Zeile



MartWe
09-07-2009, 13:06
Hallo.

Ich habe folgendes Problem:
Ich muss mit dem sed mehrere bestimmte Zeilen einer Datei in eine einzige Zeile bringen.
Die Datei hat folgenden Aufbau:
Es folgen ein paar nicht relevante Zeilen, danach kommt dann dieser Block:
.
.


U1 U2 U3 U4 U5
0 200 200 900/- 9
0 200 200 900/- 9
0 200 200 900/- 9


Ich habe es mit Hilfe des sed schon geschaft, an den Anfang der Zeile und ans Ende jeweils ein Zeichen zu schreiben.
s/^\([0-9 ]\{13,13\}\) /D\1/g
s/\ \ \ \ $/,/g

Danach sieht das ganze so aus:


U1 U2 U3 U4 U5
D 0 200 200 900/- 9 ,
D 0 200 200 900/- 9 ,
D 0 200 200 900/- 9 ,

Wie bekomme ich jetzt den Zeilenumbruch raus.
Meine bisher vergeblichen Versuche waren:
s/,$/,/g
s/,\n/,/g
s/,\nD/,D/g
/,$/N;s/,\nD/D/g

Gruss
MartWe

TBT
10-07-2009, 22:26
durch tr pipen ;) "tr -d \\n < datei.txt"

in deinem Fall so:

cat datei.txt | sed "...." | tr -d \\n

MartWe
13-07-2009, 11:42
durch tr pipen ;) "tr -d \\n < datei.txt"

in deinem Fall so:

cat datei.txt | sed "...." | tr -d \\n

Ich hab' in meiner Application leider nur den sed zur Verfügung, kann daher kein tr oder cat verwenden.

Bin aber auch mit dem sed inzwischen weiter gekommen:
Mit folgender sed Anweisung bekomme ich einen Zeilenumbruch raus:

/,$/N;s/,\n\([D ]\{5,5\}\)/\ \ \ D\ \ \ \ \ /g

Ich habe immer maximal 3 Zeilen.
Ein Problem tritt auf, bei drei relevanten Zeilen. Da wird der erste Zeilenumbruch entfernt, ich habe dann Zeile 1 und 2 in einer Zeile und die dritte Zeile dann immer noch einzeln.
Die beiden anderen Fälle passen: Aus zwei Zeilen wird eine Zeile und wenn nur eine vorhanden ist, bleibt diese auch gleich (bis auf das D und das Komma natürlich).

Wenn ich die Anweisung nochmal absetzte stimmt dann der Dreizeiler (Ergebnis ist in einer Zeile), allerdings ist der Einzeiler dann weg.
Keine Ahnung warum.

Wer weiss Rat ?

Danke im Voraus
MartWe

Waxolunist
13-07-2009, 16:17
Um alles in eine Zeile zu bekommen sollte das hier funktionieren:


sed ':a;N;$!ba;s/\n/ /g'

Eine Erklärung habe ich mal hier gepostet:

http://www.mrunix.de/forums/showpost.php?p=227256&postcount=17

Lg

Christian

Rainman
04-03-2011, 11:49
Ich weiß der Post ist schon älter, er hat mir aber vor kurzem beim gleichem Problem und beim verstehen von sed sehr geholfen....

Ich möchte noch eine Alternative ohne Sprungpunkte aufzeigen....



sed -n -e '1h;2,$H;${x;s/\n//g;p}'

1h -> Erste Zeile in den Haltebereich schreiben
2,$H -> Alle weiteren Zeilen an den Haltebereich anfügen
${ -> Am Schluss folgende Aktionen ausführen:

x -> Haltebereich in den Musterpuffer kopieren (eigentlich tauschen)
s/\n//g -> Zeilenumbrüche raus
p -> Ergebnis ausgeben
}