sed, mettre sur une ligne après avoir matché un pattern
2016-09-09
h H Copy/append pattern space to hold space.
g G Copy/append hold space to pattern space.
n N Read/append the next line of input into the pattern space.
(source: http://stackoverflow.com/questions/12833714/the-concept-of-hold-space-and-pattern-space-in-sed
La commande ldapsearch peut renvoyer des attributs avec leur valeur en base64 (présence :: après le nom de l’attribut) sur une ou plusieurs lignes (commençant par un espace).
Je souhaitais donc les merger facilement.
En regardant du côté de sed, il est possible de le faire facilement.
L’exemple ci-dessous montre la commande :
$ cat /tmp/example.txt
ligne1: valeur1
ligne2:: valeur2
sur plusieurs
lignes
ligne3:: valeur3
sur 2 lignes
ligne4:: valeur4
$ cat /tmp/example.txt | sed -re '/\w+::/{:loop;N;s/\n /|/;b loop}'
ligne1: valeur1
ligne2:: valeur2|sur plusieurs|lignes
ligne3:: valeur3|sur 2 lignes
ligne4:: valeur4
On recherche les attributs suivis de ‘::’ puis on commence une boucle (:loop) dans laquelle on rajoute la ligne suivante (N) dans le “pattern space”. On effectue alors le remplacement du retour chariot suivi de l’espace et on reboucle.