staging.inyokaproject.org

Zeilen auffüllen mit sed

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Hallo,

ich brauche mal Eure Hilfe. Ich habe eine Datei mit folgender Struktur:

Eintrag1


Eintrag2
Eintrag3








Eintrag4


Eintrag5





END

Nun möchte ich die folgenden Leerzeilen mit dem Inhalt der zuvor 'gefüllten' Zeile auffüllen. Also so:

Eintrag1
Eintrag1
Eintrag1
Eintrag2
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag4
Eintrag4
Eintrag4
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
END

Die Anzahl der Leerzeilen zwischen den Einträgen ist unterschiedlich. Wie kann ich das mit sed bewerkstelligen? Danke schon mal im Voraus.

Gruß

Carsten

Rechnungstore

Anmeldungsdatum:
18. Februar 2011

Beiträge: Zähle...

moin moin,

so richtig quick and dirty:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

while read line; do
    echo $line
    if [ ! -z "$line" ]; then
        notempty=$line
    fi
    if [ -z "$line" ];then
        line=$notempty
        echo $line
    fi      
done <text.txt | grep -v "^$"

Rechnungstore

Anmeldungsdatum:
18. Februar 2011

Beiträge: Zähle...

Nachtrag: Ist natürlich jetzt nicht mit sed, aber das Ergebnis sollte das sein, was du haben möchtest.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Das sollte so gehen:

$ sed -En '/./{h};x;P;x' < datei.txt
Eintrag1
Eintrag1
Eintrag1
Eintrag2
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag4
Eintrag4
Eintrag4
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
END
 

Also sinngemäß: Wenn die Zeile nicht leer ist, kopieren ihren Inhalt in den Hold-Space (h), danach vertausche Hold- und Patternspace (x), drucke den Patternspace (P) und vertausche beide erneut (x), damit der Inhalt der nicht-leeren Zeile dort erhalten bleibt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

seahawk1986 schrieb:

Das sollte so gehen:

Genial, aber das muss ich erst noch verstehen. ☺

Ich nehme awk:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ awk '{if (/./)last=$0;print last}' datei
Eintrag1
Eintrag1
Eintrag1
Eintrag2
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag3
Eintrag4
Eintrag4
Eintrag4
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
Eintrag5
END

Oder

1
$ awk '/./{last=$0} {print last}' datei

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Vielen lieben Dank erst mal für Eure Hilfe.

rklm schrieb:

seahawk1986 schrieb:

Das sollte so gehen:

Genial, aber das muss ich erst noch verstehen. ☺

Das geht mir genauso. Mit dem Hold/Pattern-Space bin ich immer am fremdeln und weiss nicht recht wieso. Deswegen frage ich mal:

Die geschweiften Klammern benutze ich ja unter anderem zum Gruppieren, richtig? Bezieht sich dann nur das Kommando {h} auf die RE /./?

Und ich muss mit dem 2. x Kommando den Hold/Pattern Space wieder tauschen, da ich ansonsten den Hold-Space überschreiben würde mit der aktuellen Leerzeile, richtig?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

CarstenHa schrieb:

Mit dem Hold/Pattern-Space bin ich immer am fremdeln und weiss nicht recht wieso.

Die Dokumentation zu sed ist in der Hinsicht ziemlich bescheiden...

Die geschweiften Klammern benutze ich ja unter anderem zum Gruppieren, richtig? Bezieht sich dann nur das Kommando {h} auf die RE /./?

Genau - wenn der Suchausdruck /./ einen Treffer liefert, werden die innerhalb der geschweiften Klammern gruppierten Befehle ausgeführt.

Und ich muss mit dem 2. x Kommando den Hold/Pattern Space wieder tauschen, da ich ansonsten den Hold-Space überschreiben würde mit der aktuellen Leerzeile, richtig?

Ja genau.

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 154

Vielen Dank nochmal. Und wieder was gelernt ... 😀 👍

Viele Grüße

Carsten

Antworten |