Anzeige:
Ergebnis 1 bis 5 von 5

Thema: sed-Problem: mehrere Zeilen --> eine Zeile

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.07.2009
    Beiträge
    6

    sed-Problem: mehrere Zeilen --> eine Zeile

    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:
    .
    .
    PHP-Code:
    U1          U2        U3     U4  U5
                 0       200    200  900
    /-  9            
                 0       200    200  900
    /-  9            
                 0       200    200  900
    /-  
    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:
    PHP-Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.05.2009
    Beiträge
    11
    durch tr pipen "tr -d \\n < datei.txt"

    in deinem Fall so:

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

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.07.2009
    Beiträge
    6
    Zitat Zitat von TBT Beitrag anzeigen
    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:
    PHP-Code:
    /,$/N;s/,\n\([]\{5,5\}\)/\ \ \ D\ \ \ \ \ /
    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

  4. #4
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Um alles in eine Zeile zu bekommen sollte das hier funktionieren:

    Code:
    sed ':a;N;$!ba;s/\n/ /g'
    Eine Erklärung habe ich mal hier gepostet:

    http://www.mrunix.de/forums/showpost...6&postcount=17

    Lg

    Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  5. #5
    Rainman
    Gast
    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....


    Code:
    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
    }

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •