Ich habe den sed
kommentiert Befehl, den Sie nicht verstehen:
sed '
## In first line: append second line with a newline character between them.
1N;
## Do the same with third line.
N;
## When found three consecutive blank lines, delete them.
## Here there are two newlines but you have to count one more deleted with last "D" command.
/^\n\n$/d;
## The combo "P+D+N" simulates a FIFO, "P+D" prints and deletes from one side while "N" appends
## a line from the other side.
P;
D
'
Entfernen Sie 1N
denn wir brauchen nur zwei Zeilen im 'Stack' und es reicht mit den zweiten N
, und ändern Sie /^\n\n$/d;
bis /^\n$/d;
um alle zwei aufeinanderfolgenden Leerzeilen zu löschen.
Ein Test:
Inhalt von infile
:
1
2
3
4
5
6
7
Führen Sie sed
aus Befehl:
sed '
N;
/^\n$/d;
P;
D
' infile
Das ergibt:
1
2
3
4
5
6
7
Mit awk
wäre das einfacher :
awk -v RS='\n\n\n' 1
Mit cat
wäre das einfacher :
cat -s
sed '/^$/{N;/^\n$/d;}'
Es werden nur zwei aufeinanderfolgende Leerzeilen in einer Datei gelöscht. Sie können diesen Ausdruck nur in der Datei verwenden, dann können nur Sie ihn vollständig verstehen. Wenn eine Leerzeile kommt, wird sie in geschweiften Klammern eingefügt.
Normalerweise liest sed eine Zeile. N
fügt die zweite Zeile an den Musterbereich an. Wenn diese Zeile eine leere Zeile ist. die beiden Zeilen werden durch Zeilenumbruch getrennt.
/^\n$/
dieses Muster wird zu diesem Zeitpunkt nur mit d
übereinstimmen wird funktionieren. Sonst d
nicht arbeiten. d
wird verwendet, um den gesamten Inhalt des Musterbereichs zu löschen und dann den nächsten Zyklus zu starten.