Bon en investiguant en MP il s'avère que c'est sûrement la version de "sed" sur Mac OS X qui fasse des siennes 
Donc pour expliquer la syntaxe employée...
:z
On définit une étiquette de branchement (boucle)
N
On ajoute la ligne suivante dans la mémoire principale
$ !b z
Si on n'a pas atteint la dernière ligne ($ !) on se branche à l'étiquette "z" (b z) et on boucle
Une fois que la dernière ligne est atteinte la mémoire principale de sed ressemble à ça :
Ligne 1 : champ1;champ2;champ3;champ4;\r\nLigne 2 : champ1;champ2\r\nsur plusieurs\r\nlignes;champ3;champ4;\r\nLigne 3 : champ1;champ2;champ3;champ4;\r\nLigne 4 : champ1;champ2;champ3;champ4;\r\nLigne 5 : champ1;champ2\r\nsur plusieurs\r\nlignes;champ3;champ4;\r$
En bleu les bons retours à la ligne
En rouge ceux qu'il faut changer
Donc la substitution avec "sed" devra ne prendre en compte que les fin de lignes qui ne seront pas précédées d'un point virgule.
s/\([^;]\)\r\n/\1 /g
C'est ce que fait cette commande qui matche une fin de ligne composée d'un retour chariot (\r ou \x0D) et d'une fin de ligne (\n ou \x0A) précédés de tout autre caractère qu'un point virgule ([^;]). Ce dernier étant entre parenthèse protégées "\(...\)" pour constituer une sous-expression réutilisable dans la partie droite de la substitution sous la forme "\1".
Partager