Effectuez plusieurs modifications avec un seul appel à sed

15

J'essaie d'utiliser sed pour modifier un fichier de configuration. Il y a quelques lignes que j'aimerais changer. Je sais que sous Linux sed -ipermet des modifications sur place, mais il vous faut enregistrer dans un fichier de sauvegarde. Cependant, je voudrais éviter d'avoir plusieurs fichiers de sauvegarde et apporter toutes mes modifications en place en même temps.

Existe-t-il un moyen de le faire sed -iou existe-t-il une meilleure alternative?

rclark
la source

Réponses:

21

Vous pouvez dire sedd'effectuer plusieurs opérations en répétant simplement -e(ou -fsi votre script est dans un fichier).

sed -i -e 's/a/b/g' -e 's/b/d/g' fileeffectue les deux modifications dans le fichier unique nommé file, sur place. Sans fichier de sauvegarde.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' fileeffectue les deux modifications dans le fichier unique nommé file, sur place. Avec un seul fichier de sauvegarde nommé filebak.

EightBitTony
la source
2
Notez que la séquence est importante. Dans l'exemple de commande donné ci-dessus, toutes les instances de la lettre asont transformées en b, puis toutes les instances de bsont transformées en d. Vous pouvez faire la même chose avec - sed -i -e 's/a\|b/d/g' filetransformer toutes les instances de l'une aou de l'autre ben d.
Wildcard
4

Une autre alternative est exle prédécesseur de vi. Il s'agit en fait de l' outil POSIX de choix pour l'édition de fichiers scriptés sur place; il est extraordinairement plus flexible quesed -i et sans doute encore plus portable que Perl. (Si vous restez en dehors du monde Windows, il est incontestablement plus portable que Perl.)

Il y a une pénurie relative dans cet échange de pile d'exemples de commandes utilisant ex, au moins par rapport à la pléthore d'exemples de commandes utilisant sed, awket Perl. Cependant, je me suis beaucoup plongé dans les spécifications POSIX pourex et je bats le tambour depuis. J'ai écrit de nombreuses réponses en utilisantex ici et sur l'échange de pile vi / Vim:

Lectures complémentaires:

Caractère générique
la source
3

En plus d'utiliser plusieurs -e options, vous pouvez également séparer les commandes sed dans un seul script sed à l'aide de sauts de ligne ou de points-virgules.

C'est le cas, que ce script soit une ligne unique sur la ligne de commande ou un fichier de script.

par exemple

sed -e 's/a/b/g ; s/b/d/g' file

Les caractères spatiaux autour du ; sont facultatifs. Je les ai utilisés ici pour m'assurer que le point-virgule se démarque (en général, à l'exception des nouvelles lignes séparant les commandes, l'espace blanc entre les commandes est ignoré ... mais n'oubliez pas que l'espace blanc dans les commandes peut être et est généralement important).

ou:

sed -e 's/a/b/g
        s/b/d/g' file
cas
la source