
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
/./! action
führt die Aktion (hier die n
ext-Zeile abrufen und p
drucken) für die Zeilen aus, dienicht( !
) enthält ein beliebiges einzelnes Zeichen ( .
ist der Regex-Operator, der mit jedem einzelnen Zeichen übereinstimmt).
Einige sed
Implementierungen verfügen auch über eine -i
oder -i ''
Option zum direkten Bearbeiten der Datei.
Antwort2
Dies können Sie awk
mit 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 == 0
oder verwenden NF == 0
.
Antwort4
Hierzu können Sie wie folgt vorgehen:
$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp