Votre version de sed ne supporte apparemment pas \n
dans RHS (côté droit de la substitution). Vous devez lire LA FAQ SED maintenu par Eric Pement pour choisir une des solutions possibles. Je suggère d'essayer d'abord d'insérer un caractère de nouvelle ligne littéral.
Vous trouverez ci-dessous une citation de ce document.
4.1. Comment insérer un saut de ligne dans le RHS d'une substitution ?
Plusieurs versions de sed permettent \n
à taper directement dans le RHS, qui est ensuite converti en une nouvelle ligne sur la sortie : ssed, gsed302a+, gsed103 (avec l'option -x
), sed15+, sedmod, et UnixDOS sed. La solution la plus simple est d'utiliser l'une de ces versions.
Pour d'autres versions de sed, essayez l'une des méthodes suivantes :
(a) Si vous tapez la commande sed script à partir d'un interpréteur de commandes Bourne, utilisez un backslash \
si le script utilise des 'guillemets simples' ou deux backslashes \\
si le script nécessite des "guillemets doubles". Dans l'exemple ci-dessous, notez que les guillemets >
sur la 2ème ligne est généré par le shell pour demander à l'utilisateur de saisir plus de données. L'utilisateur tape slash, single-quote, puis ENTER pour terminer la commande :
[sh-prompt]$ echo twolines | sed 's/two/& new\
>/'
two new
lines
[bash-prompt]$
(b) Utiliser un fichier script avec un backslash \
dans le script, immédiatement suivi d'une nouvelle ligne. Cela permettra d'intégrer une nouvelle ligne dans la partie "replace". Exemple :
sed -f newline.sed files
# newline.sed
s/twolines/two new\
lines/g
Certaines versions de sed peuvent ne pas avoir besoin de la barre oblique inversée de fin de ligne. Si c'est le cas, supprimez-la.
(c) Insérez un caractère non utilisé et faites passer la sortie par tr :
echo twolines | sed 's/two/& new=/' | tr "=" "\n" # produces
two new
lines
(d) Utilisez le G
commandement :
G ajoute une nouvelle ligne, plus le contenu de l'espace de maintien à la fin de l'espace de motif. Si l'espace de maintien est vide, une nouvelle ligne est quand même ajoutée. Le saut de ligne est stocké dans l'espace de motif en tant que \n
où il peut être abordé en regroupant \(...\)
et s'est déplacé dans l'ERS. Ainsi, pour modifier l'exemple "twolines" utilisé précédemment, le script suivant fonctionnera :
sed '/twolines/{G;s/\(two\)\(lines\)\(\n\)/\1\3\2/;}'
(e) Insertion de lignes entières, pas de rupture de lignes :
Si l'on ne change pas de ligne mais que l'on insère seulement des lignes complètes avant ou après un motif, la procédure est beaucoup plus facile. Utilisez le bouton i
(insérer) ou a
(append), en effectuant les modifications par un script externe. Pour insérer This line is new
AVANT chaque ligne correspondant à une regex :
/RE/i This line is new # HHsed, sedmod, gsed 3.02a
/RE/{x;s/$/This line is new/;G;} # other seds
Les deux exemples ci-dessus sont prévus comme des commandes "d'une ligne" entrées depuis la console. Si vous utilisez un sed script, i\
immédiatement suivie d'une nouvelle ligne littérale fonctionnera sur toutes les versions de sed. En outre, la commande s/$/This line is new/
ne fonctionnera que si l'espace d'attente est déjà vide (ce qui est le cas par défaut).
Pour ajouter This line is new
APRÈS chaque ligne correspondant à une regex :
/RE/a This line is new # HHsed, sedmod, gsed 3.02a
/RE/{G;s/$/This line is new/;} # other seds
Pour ajouter 2 lignes vides après chaque ligne correspondant à une regex :
/RE/{G;G;} # assumes the hold space is empty
Pour remplacer chaque ligne correspondant à une expression rationnelle par 5 lignes vides :
/RE/{s/.*//;G;G;G;G;} # assumes the hold space is empty
(f) Utilisez le y///
si possible :
Sur certaines versions Unix de sed (pas GNU sed !), bien que l'option s///
n'acceptera pas \n
dans l'ERS, le y///
le fait. Si votre Unix sed le supporte, une nouvelle ligne après aaa
peut être inséré de cette façon (qui n'est pas portable à GNU sed ou à d'autres seds) :
s/aaa/&~/; y/~/\n/; # assuming no other '~' is on the line!