Comment utiliser sed pour ne supprimer que les doubles lignes vides?

J’ai trouvé cette question et j’ai répondu sur la façon de supprimer les sortingples lignes vides. Cependant, je n’ai besoin de la même chose que pour les doubles lignes vides. C’est à dire. Toutes les lignes doubles vierges doivent être supprimées complètement, mais des lignes vierges doivent être conservées.

Je connais un peu sed, mais la commande proposée pour supprimer les sortingples lignes vides est sur ma tête:

sed '1N;N;/^\n\n$/d;P;D'

J’ai commenté la commande sed vous ne comprenez pas:

 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 ' 

Supprimez 1N car nous n’avons besoin que de deux lignes dans la “stack” et il est suffisant avec le second N , et changez /^\n\n$/d; à /^\n$/d; pour supprimer toutes les deux lignes vides consécutives.

Un examen:

Contenu de l’ infile :

 1 2 3 4 5 6 7 

Exécutez la commande sed :

 sed ' N; /^\n$/d; P; D ' infile 

Cela donne:

 1 2 3 4 5 6 7 

Ce serait plus facile avec cat :

 cat -s 

Ce serait plus facile avec awk :

 awk -v RS='\n\n\n' 1 
 sed '/^$/{N;/^\n$/d;}' 

Il ne supprimera que deux lignes vierges consécutives dans un fichier. Vous ne pouvez utiliser cette expression que dans un fichier, vous seul pouvez le comprendre pleinement. Quand une ligne blanche viendra, elle entrera dans des accolades.

Normalement, sed lit une ligne. N appenda la deuxième ligne à l’espace du motif. Si cette ligne est une ligne vide. les deux lignes sont séparées par une nouvelle ligne.

/^\n$/ ce modèle correspondra à cette heure, seul le d fonctionnera. Sinon d pas travailler. d est utilisé pour supprimer l’ensemble du contenu de l’espace, puis commence le cycle suivant.

Il suffit de le diriger vers la commande «uniq» et toutes les lignes vides, quel que soit leur nombre, seront réduites à une seule. Plus simple, c’est mieux.

Clarification: comme Marlar l’a déclaré, ce n’est pas une solution si vous ne voulez pas vous débarrasser des “autres lignes consécutives non vides”. C’est une solution dans d’autres cas comme lors de la tentative de nettoyage des fichiers de configuration, c’était la solution que j’avais après avoir vu cette question. J’ai résolu mon problème en utilisant simplement “uniq”.