sed: multiline: newline ersetzen mit Bedinung

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Orca75, 21.04.2007.

  1. Orca75

    Orca75 Grünschnabel

    Dabei seit:
    21.04.2007
    Beiträge:
    2
    Zustimmungen:
    0
    Ort:
    Schweiz
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 21.04.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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.
     
  4. Orca75

    Orca75 Grünschnabel

    Dabei seit:
    21.04.2007
    Beiträge:
    2
    Zustimmungen:
    0
    Ort:
    Schweiz
    Hallo Wolfgang

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

    Vielen Dank
    Orca75
     
Thema:

sed: multiline: newline ersetzen mit Bedinung

Die Seite wird geladen...

sed: multiline: newline ersetzen mit Bedinung - Ähnliche Themen

  1. awk multiline Problem

    awk multiline Problem: Ich habe ein Problem mit der Extrahierung von speziellen Zeilen aus einem Logfile, komm aber einfach nicht auf eine passende Lösung. ?( Es...
  2. Problem mit sed (newline am Ende)

    Problem mit sed (newline am Ende): Hallo, ich habe ein Problem mit sed: Ich verwende folgendes Script: sed -n '/^[^#|^ ].*/p' /k/_builder/versions.conf >...
  3. [mntent]: warning: no final newline at the end of /etc/fstab

    [mntent]: warning: no final newline at the end of /etc/fstab: hallo habe SUSE 9.1 mit KDE 3.2 und freeBSD 5.3 auf der gleichen festplatte installiert: Device Boot Start End Blocks...