Qui n’a jamais eu besoin de faire une recherche récursive afin de remplacer une occurrence dans plusieurs fichiers?
Pour se faire, nous allons combiner les commandes find, xargs et sed en version GNU obligatoirement sinon les options utilisées ne seront pas reconnues.

Dans l’exemple ci-dessous nous allons remplacer l’occurence « redmine.bilboplanet.com » par « chili.kiwais.com/projects/bilboplanet » dans tout le code source du Bilboplanet:

Nous allons commencer par rechercher tous les fichiers avec l’utilitaire « find », pour cela on va utiliser deux options:

  • L’option « -type f »: permet de ne rechercher que des fichiers.
  • L’option « -print0»: permet de remplacer le caractère espace par le caractère générique null (\0)

Ce qui nous donne la commande suivante:

$ find . -type f -print0

En suivant, nous allons (au travers d’un pipe) utiliser la commande xargs pour gérer la sortie du process find avec l’option suivante:

  • L’option -0 permet la gestion du caractère null

Suivi de « ce que l’on veut faire », nous allons utiliser la commande sed:

  • L’option « -i » permet une modification du fichier courant
  • L’expression suivante indique ce que l’on souhaite faire, elle se découpe en 4 et est encadré par des simples quotes « ‘ »:
    1. le « s » indique substitute: de ce fait on va remplacer toutes les occurences d’une expression par une autre
    2. La chaîne de caractère après le « s/ » indique qu’elle occurence nous recherchons, cela peut être une expression régulière, et elle se termine par un « / »*
    3. La chaîne de caractère suivante (après le deuxième « / ») indique quelle chaîne de caractère remplacera l’occurence trouver et elle se termine par un « / »*
    4. Le « g » indique que l’on procède à un remplacement global

Ce qui nous donne la ligne de commande:

$ xargs -0 sed -i 's/SEARCH/REPLACE/g'

Si nous mettons les deux commandes bout à bout sans oublier le pipe « | » cela nous donne donc:

$ find . -type f -print0 | xargs -0 sed -i 's/SEARCH/REPLACE/g'

* Dans sed (et beaucoup d’autres programmes) le caractère « \ » est le caractère d’échappement pour les caractères spéciaux tel que « / », « @ », « $ », …. De ce fait si vous recherchez une chaîne contenant le caractère « / » il faudra saisir « \/ » pour que celui-ci ne soit pas interprêté.

Voici à présent ce que cela donne lorsqu’on souhaite remplacer la chaîne de caractère « redmine.bilboplanet.com » par « chili.kiwais.com/projects/bilboplanet » (en n’oubliant pas le caractère d’échappement)*:

$ find . -type f -print0 | xargs -0 sed -i 's/redmine.bilboplanet.com/http:\/\/chili.kiwais.com\/projects\/bilboplanet/g'