J'ai deux fichiers texte :file1
et file2
, les deux avec plusieurs lignes.
$ cat file1
line one
line two
line three
line four
line five
$ cat file2
line A
line B
line C
line D
line E
line F
Je voudrais substituer une gamme de lignes de file1
(à partir de la ligne 1_start
à la ligne 1_end
) avec une plage de lignes de file2
(à partir de la ligne 2_start
à la ligne 2_end
).
Par exemple, substituez les lignes 2,4
dans file1
avec les lignes 3,5
de file2
.
Ce que je ne pouvais faire jusqu'à présent, c'est extraire les lignes nécessaires de file2
avec
$ sed -n 3,5p file2
Mais cela n'aide pas à les mettre dans file1
. Est-ce possible avec sed
? Si non, est-ce possible avec un outil similaire ?
Réponse acceptée :
sed
peut imprimer une plage donnée de lignes avec quelque chose comme ceci :
sed -n 'X,Yp' filename
Où X
est la première ligne d'une plage et Y
est la dernière ligne, toutes deux inclusives. -n
dit sed
de ne rien imprimer à moins qu'on ne lui dise explicitement de le faire et c'est ce que le p
suivant la gamme fait.
Ainsi, vous pouvez facilement l'appeler trois fois, l'ajouter à un fichier temporaire, puis déplacer ce fichier où vous le souhaitez. Vous pouvez également les combiner tous en utilisant cat
et processus de substitution comme le montre cet exemple (j'utilise des numéros de ligne que je viens de sortir de nulle part ; $
est la dernière ligne d'un fichier) :
cat <(sed -n '1,5p' file1) <(sed -n '10,12p' file2) <(sed -n '9,$p' file1) > file1.tmp && mv file1.tmp file1
Ici, nous remplacerions les lignes 6, 7 et 8 dans file1
avec les lignes 10, 11 et 12 de file2
.
Mise à jour : Merci à @MiniMax d'avoir signalé que cat
et la substitution de processus peut être évitée en procédant comme suit :
{ sed -n '1,5p' file1; sed -n '10,12p' file2; sed -n '9,$p' file1; } > file1.tmp && mv file1.tmp file1
BAISER, après tout. 🙂