Wie ersetze ich eine leere Zeile durch die Zeile darunter?

Wie ersetze ich eine leere Zeile durch die Zeile darunter?

Ich habe eine Datei analysiert, aber es gibt ein Problem. Eine schnelle Lösung besteht darin, eine leere Zeile durch eine Zeile darunter zu ersetzen. Wie mache ich das?

wie die folgende Datei

apple

banana
big
sig

cake

sollte konvertieren in

apple
banana
banana
big
sig
cake
cake

Antwort1

Mit sed:

sed -ne '/./!{n;p;}' -e p your-file

/./! actionführt die Aktion (hier die next-Zeile abrufen und pdrucken) für die Zeilen aus, dienicht( !) enthält ein beliebiges einzelnes Zeichen ( .ist der Regex-Operator, der mit jedem einzelnen Zeichen übereinstimmt).

Einige sedImplementierungen verfügen auch über eine -ioder -i ''Option zum direkten Bearbeiten der Datei.

Antwort2

Dies können Sie awkmit der getline()Funktion tun. Der Befehl funktioniert, indem er die leeren Zeilen in der Textdatei auswählt !NF, also die Zeilen, die leer sind (Anzahl der Felder in der Zeile ist 0). Mit der getline()Funktion erhalten wir dienächstesofortige Zeile aus der leeren Zeile und speichern in der Variablen nxt.

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

Der Teil innerhalb {..}dieser Zeile erstellt dann eine Kombination aus der Variable, einem eingebetteten Zeilenumbruch (Stringverkettung mit ORS) und der Variable zurück. Das 2. Anhängen ist notwendig, da getline()der Aufruf standardmäßig den Zeilenzeiger um eine Ebene vorrückt. SieheWie kann ich eine Datei mit awk dauerhaft ändern? („In-Place“-Änderungen, wie mit „sed -i“)um die Datei dynamisch zu ändern.

Antwort3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

oder

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

was zum gleichen Ergebnis führt.

Dadurch wird jede Zeile 1 Mal gedruckt, plus so oft, wie die Leerzeilen darüber liegen. Die Leerzeilen werden in der Variablen gezählt r.

Leere Zeilen werden mit dem regulären Ausdruck erkannt ^$, Sie können aber auch length == 0oder verwenden NF == 0.

Antwort4

Hierzu können Sie wie folgt vorgehen:

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp

verwandte Informationen