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. 🙂