sed: multiline: newline ersetzen mit Bedinung

O

Orca75

Grünschnabel
Hi

Ich habe einen Text, den ich mit sed so umwandeln möchte, dass alle Zeilen, die nicht mit hostname beginnen, mit einem Komma auf die selbe Zeile geschrieben werden. Das ganze probiere ich auf auf UNIX unter einer bash und mit den UnxUtils unter Windows, kriege es aber nicht hin.

Code:
hostname aaa1-2
get-host a1
host a2
hostname bbb1-4
get-host,b1
host,b2
get-host,b3
get-host,b4
host,b5
hostname ccc1-5
host,c1
get-host,c2
get-host,c3
host,c4
host,c5
und erwarte diese Ausgabe:
Code:
hostname aaa1-2,get-host a1,host a2
hostname bbb1-4,get-host,b1,host,b2,get-host,b3,get-host,b4,host,b5
hostname ccc1-5,host,c1,get-host,c2,get-host,c3,host,c4,host,c5
Im Moment habe ich folgendes:
Code:
:loop
{
N
s/\([^\n]*\)\n\(get-\)\?host\([^n]\)/\1,\2host\3/
}
t loop
was folgendes ergibt:
Code:
sed -f y.txt x.txt
hostname aaa1-2,get-host a1,host a2
hostname bbb1-4
get-host,b1,host,b2,get-host,b3,get-host,b4
hostname ccc1-5
host,c1,get-host,c2,get-host,c3,host,c4,host,c5
a) Wieso ersetzt er nur das erste newline hinter hostname?
b) Könnte ich das ganze negieren, d.h. lösche das newline nicht, wenn in der nächsten Zeile das hostname vorkommt?
c) Könnte man dies einfacher in awk schreiben?

Danke
Chris
 
Hallo
a) Weil t nur dann springt, wenn ersetzt wurde.
Du hast aber nach der ersten Ersetzung den Patternspace geändert, so dass es zu keinen weiteren Ersetzungen mehr kommt.
b) Ja das geht mit verschachtelten Rückwärtsreferenzen.
c) Ja, dafür gibt es getline in awk.

Wenn deine Datei immer mit hostname beginnt, folgender Schnellschuß.
Ist nicht elegant, sollte es aber tun.
Code:
$ cat testdatei:
hostname aaa1-2
get-host a1
host a2
hostname bbb1-4
get-host,b1
host,b2
get-host,b3
get-host,b4
host,b5
hostname ccc1-5
host,c1
get-host,c2
get-host,c3
host,c4
host,c5

$ sed -ne '$!H;${H;x;s/^.//;s/\n/,/g;s/,\(hostname\)/\n\1/g;p}' testdatei 
hostname aaa1-2,get-host a1,host a2
hostname bbb1-4,get-host,b1,host,b2,get-host,b3,get-host,b4,host,b5
hostname ccc1-5,host,c1,get-host,c2,get-host,c3,host,c4,host,c5
Ich hoffe du verwendest GNU sed und es funktioniert bei dir.

Der Trick ist hier einfach alles in den Holdspace einzulesen,
dann das erste Newline (aus dem vorher leeren Holdspace entfernen,
dann alle \n durch Komma
dann alle ,hostname durch \nhostname
dann print

Gruß Wolfgang
PS Ob es unter Windows so geht, weiß ich nicht.
 
Hallo Wolfgang

Funktioniert super.
a) Hätte ich auch drauf kommen können.
c) werde mir awk auch mal genauer anschauen.

Vielen Dank
Orca75
 

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Bestimme Teile aus Datei ausschneiden

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

sed im script per crontab

Denial of Service vom Provider?

Zurück
Oben