Exemple de recherche et de remplacement sous Linux

Exemple de recherche et remplacement Linux

J'ai récemment été dans une situation où je devais changer du texte qui apparaissait dans un tas de fichiers de configuration qui se trouvaient dans des sous-répertoires imbriqués. N'ayant pas le temps de dépoussiérer les compétences perl vieilles de 10 ans, je cherchais des commandes shell qui fonctionneraient. Étonnamment, il existe de nombreux exemples sur le Web qui fonctionnent avecnot, alors j'ai fini avec ces variations:

N'hésitez pas à les tester d'abord et à étudier leur fonctionnement. Dans les deux cas, nous fournissons une liste des fichiers souhaités, à la commande linux «sed», en utilisant xargs pour construire la commande sed (voirthis article pour un résumé intéressant de xargs).

1. Rechercher et remplacer tous les fichiers

Si vous devez remplacer un certain ensemble de texte dans un ensemble de fichiers, mais que vous ne savez pas quels fichiers peuvent contenir le texte que vous recherchez, cela peut être utile:

grep -lr -e 'old text' * | xargs sed -i 's/old text/new text/g'

En utilisant grep ici, nous recherchons récursivement (l'option «-r») des fichiers contenant le texte «ancien texte». Vous pouvez vraiment faire preuve de créativité avec regex ici, ce qui est facilité par l'option «-e».

Grep fournit la liste des fichiers (l'option «-l») sur lesquels effectuer la recherche et le remplacement (vous pouvez exécuter cette partie seule pour voir sa sortie); cette liste de fichiers est ensuite redirigée vers la commande set, qui effectue alors le travail réel de recherche et de remplacement de l'ancien texte par un nouveau texte.

L'option «-i» de sed entraîne une modification sur place, ce qui signifie que le fichier d'origine est modifié (dans ma situation, c'était nécessaire - mais sed peut être dit de faire une sauvegarde si vous le fournissez avec -i). Le «s» dans «s /…» signifie «substitut» et le «g» signifie «remplacement global» - ce qui est exactement ce qui se passe.

2. Rechercher et remplacer le fichier spécifié

Si vous connaissez le nom du fichier que vous devez mettre à jour, vous pouvez utiliser cette variante:

find -name myconfig_file.txt | xargs sed -i 's/old text/new text/g'

C'est fondamentalement la même idée, mais en utilisant à la place l'opération de recherche pour fournir une liste de fichiers qui correspondent au nom donné. Cela parcourt tous les sous-répertoires à partir de current. La liste des fichiers est ensuite redirigée vers sed de la même manière que celle décrite ci-dessus.

P.S Above command tested on Ubuntu and RedHat