Recherche de site Web

Comment remplacer du texte dans plusieurs fichiers en utilisant un script Bash sous Linux


Si vous avez de nombreux fichiers contenant des informations obsolètes, les mettre à jour manuellement prend beaucoup de temps. Qu'il s'agisse de corriger des chemins de fichiers obsolètes, de renommer des variables ou de modifier des valeurs de configuration, Bash offre des outils puissants comme grep, sed et find pour automatiser cette tâche. Dans ce guide, nous allons apprendre comment remplacer du texte dans plusieurs fichiers efficacement en utilisant un script Bash.

Pourquoi et quand utiliser Bash pour le remplacement de texte en masse ?

L'automatisation du remplacement de texte est utile pour :

  • Mise à jour des noms de variables dans les fichiers de code.
  • Modifier les chemins de fichiers dans les scripts.
  • Correction des paramètres de configuration incorrects.
  • Renommer les noms de projets dans la documentation.

Au lieu de modifier chaque fichier manuellement, un script Bash peut le faire en quelques secondes.

Permettez-moi de l'expliquer avec un exemple de script Bash.

Problème : Remplacer en masse les chemins dans plusieurs fichiers

Imaginez que vous avez plusieurs fichiers faisant référence à d'anciens chemins de fichiers journal :

  • Ancien chemin : ~/data/logs/app.log
  • Nouveau chemin : ~/data/log/app.log

Au lieu de rechercher et de remplacer chaque instance manuellement, automatisons-le.

Étape 1 : Créez un répertoire de test et des fichiers d'exemple

Tout d'abord, créez un environnement de test avant de modifier des fichiers réels.

Créez un répertoire dans votre dossier personnel :

mkdir -p ~/replace_test && cd ~/replace_test

Créer des fichiers d'exemple contenant l'ancien chemin :

echo 'Log file: ~/data/logs/app.log' > script1.sh
echo 'ERROR_LOG="~/data/logs/app.log"' > config.env
echo 'echo "Processing ~/data/logs/app.log"' > process.sh

Vérifiez les occurrences de l'ancien chemin :

grep "~/data/logs/app.log" *

Exemple de sortie :

config.env:ERROR_LOG="~/data/logs/app.log"
process.sh:echo "Processing ~/data/logs/app.log"
script1.sh:Log file: ~/data/logs/app.log

Étape 2 : Remplacer le texte dans plusieurs fichiers en utilisant un script Bash

Maintenant, créez un script nommé replace_text.sh :

#!/usr/bin/env bash
if [[ $# -ne 3 ]]; then
    echo "Usage: $0 <old_path> <new_path> <directory>"
    exit 1
fi
OLD_PATH=$(printf '%s\n' "$1" | sed 's/[\/&]/\\&/g')
NEW_PATH=$(printf '%s\n' "$2" | sed 's/[\/&]/\\&/g')
SEARCH_DIR=$3
echo "Replacing occurrences of: $1 -> $2 in $SEARCH_DIR"
# Find and replace text safely
find "$SEARCH_DIR" -type f -exec sed -i "s/$OLD_PATH/$NEW_PATH/g" {} +
echo "Replacement completed."

Étape 3 : Rendre le script exécutable

chmod +x replace_text.sh

Étape 4 : Exécuter le script

Exécutez le script pour remplacer toutes les occurrences de ~/data/logs/app.log par ~/data/log/app.log :

./replace_text.sh "~/data/logs/app.log" "~/data/log/app.log" ~/replace_test

Exemple de sortie :

Replacing occurrences of: ~/data/logs/app.log -> ~/data/log/app.log in /home/ostechnix/replace_test
Replacement completed.

Étape 5 : Vérifier les modifications

Courir :

grep "~/data/log/app.log" *

Exemple de sortie :

config.env:ERROR_LOG="~/data/log/app.log"
process.sh:echo "Processing ~/data/log/app.log"
script1.sh:Log file: ~/data/log/app.log

Assurez-vous qu'aucun ancien chemin ne subsiste :

grep "~/data/logs/app.log" *

S'il n'y a aucune sortie, le remplacement a fonctionné.

Ce script,

  • Gère les caractères spéciaux : Échappe correctement /, & et d'autres symboles.
  • Utilise find -exec sed : Plus sûr que grep | xargs sed.
  • Efficace pour les grands projets : fonctionne sur de nombreux fichiers sans utiliser excessivement le CPU.

Vous pouvez maintenant utiliser ce script sur des fichiers réels.

Précautions avant de l'exécuter sur de vrais fichiers :

  • Sauvegardez vos fichiers : Créez toujours une sauvegarde avant d'effectuer des modifications en masse
  • Test sur un petit échantillon : Exécutez-le d'abord sur un répertoire de test, comme nous l'avons fait avec ~/replace_test.
  • Exécution à blanc avec grep : Vérifiez combien de fichiers seront affectés. Vous pouvez exécuter grep -rl "~/data/logs/app.log" ~/replace_test/ pour le faire.
  • Inspecter manuellement les modifications : Après avoir exécuté le script, vérifiez quelques fichiers modifiés.

Conclusion

Dans ce tutoriel, nous avons appris comment remplacer du texte dans plusieurs fichiers en utilisant un simple script Bash. Nous avons expliqué comment ce script automatise la mise à jour des chemins dans plusieurs fichiers, prévenant ainsi les erreurs et faisant gagner du temps grâce à un exemple pratique. Testez toujours avec des copies de sauvegarde avant de l'exécuter sur des fichiers critiques.

Lecture connexe :

  • Tutoriel de script Bash pour débutants