6 façons de rechercher et de remplacer du texte dans le terminal Linux
Modifier un fichier de configuration ou mettre à jour un document volumineux en parcourant chaque ligne manuellement peut prendre beaucoup de temps. Cependant, avec des outils de ligne de commande tels que sed, awk, Vim et autres, vous pouvez rendre le processus de recherche et de remplacement rapide et efficace.
Sommaire
Utiliser la commande sed
Vous voulez des remplacements de texte rapides ? Utilisez la commande sed. Avec sed, vous pouvez rechercher et modifier du texte dans des fichiers, en gérant tout, des simples substitutions aux manipulations de texte complexes.
Supposons que vous ayez un fichier nommé exemple.txt contenant le mot « Linux » et que vous décidiez de le remplacer par « Windows ». Pour ce faire, exécutez :
sed 's/Linux/Windows/g' example.txt
Ici, le s le drapeau signifie substitut, et le g flag permet à sed de remplacer toutes les occurrences de modèle sur chaque ligne.
La commande précédente ne modifie pas directement le fichier d'origine ; il affiche uniquement la sortie modifiée dans le terminal. Cependant, si vous souhaitez manipuler directement le fichier original, utilisez l'option -je drapeau:
sed -i 's/Linux/Windows/g' example.txt
Le -je flag effectue les modifications directement dans le fichier au lieu d'afficher uniquement la sortie.
Vous souhaitez sauvegarder votre fichier avant d'apporter des modifications ? Ajouter une extension au -je drapeau:
sed -i.bak 's/Linux/Windows/g' example.txt
Cela crée un fichier de sauvegarde appelé exemple.txt.bak avant d'apporter des modifications.
Mais que se passe-t-il si vous souhaitez que votre fichier d'origine reste inchangé ? Vous pouvez créer un nouveau fichier et y enregistrer la sortie modifiée à l'aide de l'opérateur de redirection.
Par exemple, pour envoyer la sortie vers un fichier séparé, utilisez :
sed 's/Linux/Windows/g' example.txt > file.txt
L'utilisation de modèles d'expressions régulières complexes avec sed vous permet de contrôler ce qu'il faut remplacer dans des fichiers plus volumineux au contenu répétitif. Pour remplacer plusieurs instances par une seule commande, exécutez :
sed -i 's/Linux|Ubuntu/Windows/g' example.txt
Une astuce que j'utilise souvent avec sed consiste à passer à un délimiteur différent si mes chaînes de recherche ou de remplacement contiennent des barres obliques. Par exemple, lorsque je travaille avec des chemins de fichiers, j'aime utiliser le symbole @ comme délimiteur :
sed 's@old/path@new/path@g' file.txt
Cela rend la commande plus facile à lire et évite le besoin de nombreux caractères d'échappement.
Remplacer le texte à l'aide de la commande awk
Comme sed, awk effectue également des manipulations de texte simples à avancées. J'utilise souvent awk pour gérer des données structurées, en particulier avec des fichiers CSV, où des calculs sur des champs sélectionnés peuvent être nécessaires.
Bien que awk soit bien connu pour gérer des données structurées, il est également efficace pour les tâches de recherche et de remplacement rapides. Par exemple, pour remplacer un texte spécifique dans un fichier, vous pouvez utiliser :
awk '{gsub(/Windows/, "Linux"); print}' file.txt > new_file.txt
Ici, le gsub La fonction effectue une substitution globale, en remplaçant chaque occurrence de « Windows » par « Linux » sur chaque ligne du fichier. Puisque awk ne modifie pas directement les fichiers, nous redirigeons la sortie vers new_file.txt pour capturer les modifications.
J'utilise également awk pour nettoyer les exportations de données, notamment à partir de feuilles de calcul, où un formatage supplémentaire peut compliquer le traitement des données. De nombreuses exportations de feuilles de calcul incluent des guillemets autour des valeurs, ce qui peut perturber le traitement des données dans d'autres applications.
Vous pouvez supprimer tous les guillemets doubles de la première colonne d'un fichier CSV à l'aide de cette commande :
awk -F, '{gsub(/"/, "", $1); print}' data.csv > cleaned_data.csv
Ici, gsub supprime chaque guillemet double de la première colonne uniquement et la sortie est redirigée vers cleaning_data.csv pour une utilisation ultérieure.
Remplacer le texte par le mode Vim Ex
Vous voulez des transformations de texte rapides sans ouvrir l’éditeur complet ? Essayez Vim (Vi amélioré), un éditeur de texte avec un mode Ex qui vous permet d'effectuer des opérations de recherche et de remplacement directement à partir de la ligne de commande.
Pour commencer, ouvrez votre fichier avec Vim :
vim filename.txt
Ensuite, entrez en mode Ex en appuyant sur Échap, puis utilisez la touche (:). Cela vous demandera deux points (:) en bas du terminal, indiquant que vous êtes en mode Ex. Pour rechercher et remplacer du texte, utilisez cette commande :
:%s/macOS/Linux/g
Cette commande remplace toutes les occurrences de « macOS » par « Linux » dans tout le fichier. Le symbole % spécifie que la commande doit s'appliquer à l'ensemble du fichier, et l'indicateur g à la fin garantit que toutes les occurrences de chaque ligne sont remplacées, pas seulement la première.
Pour remplacer uniquement la première occurrence de chaque ligne, omettez simplement le g drapeau:
:%s/macOS/Linux/
Besoin de remplacer du texte dans une plage de lignes spécifique ? Spécifiez la plage de lignes. Par exemple, pour remplacer le texte de la ligne 3 par la ligne 10 :
:3,10s/macOS/Linux/g
Une habitude que je prends lorsque je modifie des fichiers est de confirmer chaque remplacement. Cette approche permet des modifications minutieuses, ligne par ligne.
Pour obtenir une invite pour chaque remplacement, ajoutez c à la fin de la commande :
:%s/macOS/Linux/gc
Utilisation du script Bash
Parfois, vous devrez peut-être effectuer une série d’opérations de recherche et de remplacement sur plusieurs fichiers ou répertoires. Dans ces cas, l'utilisation de scripts Bash peut automatiser vos tâches qui prendraient beaucoup de temps à effectuer manuellement.
Considérons un script simple qui remplace une ancienne chaîne par une nouvelle chaîne dans plusieurs fichiers texte du répertoire actuel :
#!/bin/bash
for file in *.txt; do
sed -i 's/Windows/Linux/g' "$file"
done
Pour utiliser ce script, enregistrez-le d'abord dans un fichier (par exemple, bashexample.sh), puis rendez le fichier exécutable en exécutant :
chmod +x bashexample.sh
Ensuite, exécutez le script avec :
./bashexample.sh
La boucle for parcourt tous les fichiers texte du répertoire actuel et utilise sed pour remplacer le texte dans chaque fichier. Vous pouvez également modifier ce script pour gérer différents modèles ou types de fichiers selon vos besoins.
Remplacer le texte par un script Python
Grâce aux capacités avancées de traitement de texte de Python, vous pouvez effectuer des tâches de recherche et de remplacement sur des fichiers directement depuis le terminal. Les scripts Python sont utiles lorsque vous souhaitez des opérations plus complexes, telles que la gestion de plusieurs fichiers avec une logique conditionnelle.
Tout d’abord, créez un nouveau fichier Python. Vous pouvez utiliser n'importe quel éditeur de texte, tel que nano ou Vim :
vim textfile.py
Ensuite, ajoutez le script Python suivant au fichier :
#!/usr/bin/env python
import sys
with open(sys.argv(1), 'r+') as f:
content = f.read().replace('Windows', 'Linux')
f.seek(0)
f.write(content)
f.truncate()
Après avoir enregistré le fichier, rendez-le exécutable en exécutant :
chmod +x ./testfile.py
Ensuite, exécutez le script en passant le fichier cible comme argument de ligne de commande :
python3 ./testfile.py input.txt
Ce script lit le contenu de input.txt, remplace les occurrences de l'ancien texte par le nouveau texte et enregistre les modifications directement dans le fichier.
Remplacer le jeu de caractères par la commande tr
Avez-vous déjà eu besoin de remplacer un seul caractère par un autre caractère dans l'ensemble du fichier ? Si oui, vous devez essayer la commande tr. Cette commande est parfaite pour les remplacements ou suppressions simples de caractères.
Par exemple, je l'utilise souvent pour convertir des caractères spécifiques d'un fichier texte en majuscules ou minuscules. Pour remplacer tous les a et d minuscules par des A et D majuscules dans un fichier texte, exécutez :
tr 'a,d' 'A,D' < example.txt
N'oubliez pas que tr fonctionne sur des caractères plutôt que sur des chaînes ou des mots, il est donc mieux adapté aux remplacements de caractères simples plutôt qu'aux modèles plus complexes.
Vous pouvez également nettoyer les espaces ou standardiser les fins de ligne en exécutant ceci :
cat messy_file.txt | tr 'r' 'n' > clean_file.txt
Cela convertit les fins de ligne de style Windows (rn) en fins de ligne de style Unix (n), ce qui est utile lorsque vous travaillez avec des fichiers sur différents systèmes d'exploitation.
Utiliser Perl
Perl, un langage de programmation de haut niveau, peut également être utilisé directement dans le terminal pour rechercher et remplacer du texte, ce qui en fait une excellente alternative à sed. Sa syntaxe est similaire à celle de sed, mais elle offre des fonctionnalités plus avancées.
Personnellement, j'ai vraiment aimé Perl en raison de ses capacités d'expression régulière particulièrement puissantes, qui en font un excellent choix pour les opérations complexes de recherche et de remplacement.
Vous pouvez remplacer n'importe quel mot dans un fichier en utilisant cette commande :
perl -pi -e 's/Linux/Windows/g' file.txt
Ici, le -pi les drapeaux indiquent à Perl d'éditer le fichier sur place, et le -e flag vous permet de passer une expression directement. Cette commande modifie file.txt en remplaçant « Linux » par « Windows » dans tout le fichier.
Pour des substitutions simples, les outils de ligne de commande comme sed, awk ou perl fonctionnent bien. Choisissez un script Bash ou Python si vous devez effectuer une substitution plus complexe sur plusieurs fichiers ou avec une logique supplémentaire.