Ho commentato il sed
comando che non capisci:
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
'
Rimuovi 1N
perché ci servono solo due righe nello 'stack' ed è sufficiente con il secondo N
e cambia /^\n\n$/d;
a /^\n$/d;
per eliminare tutte e due le righe vuote consecutive.
Un test:
Contenuto di infile
:
1
2
3
4
5
6
7
Esegui il sed
comando:
sed '
N;
/^\n$/d;
P;
D
' infile
Ciò produce:
1
2
3
4
5
6
7
Questo sarebbe più facile con awk
:
awk -v RS='\n\n\n' 1
Questo sarebbe più facile con cat
:
cat -s
sed '/^$/{N;/^\n$/d;}'
Eliminerà solo due righe vuote consecutive in un file. Puoi usare questa espressione solo nel file, quindi solo tu puoi comprenderla appieno. Quando arriverà una riga vuota che entrerà tra parentesi graffe.
Normalmente sed leggerà una riga. N
aggiungerà la seconda riga allo spazio del modello. Se quella riga è una riga vuota. le due righe sono separate da newline.
/^\n$/
questo schema corrisponderà a quella volta solo al d
funzionerà. Altrimenti d
non funziona. d
viene utilizzato per eliminare l'intero contenuto dello spazio modello, quindi avviare il ciclo successivo.