Rechercher et remplacer des chaînes complexes en utilisant Sed avec Regex
-
Rechercher et remplacer des chaînes à l’aide de
seddans Bash -
Rechercher et remplacer le caractère délimiteur
/dans une chaîne dans Bash - Trouvez tous les nombres et remplacez-les par le numéro de chaîne dans Bash
Lorsque vous travaillez avec des fichiers texte, vous devrez fréquemment identifier et remplacer des chaînes de texte dans un ou plusieurs fichiers.
sed est un éditeur de flux. Il peut effectuer une manipulation de texte rudimentaire sur des fichiers et des flux d’entrée tels que des pipelines. Vous pouvez utiliser sed pour rechercher, trouver et remplacer des mots et des lignes, ainsi que pour les insérer et les supprimer.
Les regex de base et étendues sont prises en charge, ce qui vous permet de faire correspondre des modèles complexes. Dans cet article, nous verrons comment utiliser sed pour rechercher et remplacer des chaînes. Nous montrerons également comment utiliser la recherche et le remplacement récursifs.
Rechercher et remplacer des chaînes à l’aide de sed dans Bash
Il existe différentes versions de sed, chacune avec ses fonctionnalités.
Les distributions Linux sont livrées avec GNU sed préinstallé par défaut, mais Mac OS utilise la version BSD. Nous allons utiliser la version GNU.
La syntaxe est utilisée pour rechercher et remplacer du texte par sed :
sed -e 's/Search_Regex/substitution/g' Filename
Dans la syntaxe utilisée ci-dessus, voici la définition :
- Le
-eest la sortie de sed écrite sur la sortie standard par défaut. Ce paramètre demande àsedde modifier les fichiers à leur emplacement actuel. Si une extension est définie, un fichier de remplacement est généré. - Le
///est un caractère qui fait office de séparateur. Bien que la plupart des gens utilisent le caractère barre oblique (/), il peut s’agir de n’importe quel caractère. - Le
Search_Regexest un pour rechercher quelque chose. Nous utiliserons uneregexou une chaîne régulière. - La
substitutionest utilisée comme des chaînes à substituer. - Le
gest un drapeau de substitution globale. Lesedlit le fichier ligne par ligne par défaut et ne modifie que la première occurrence duSearch_Regexsur chaque ligne. Toutes les instances sont remplacées lorsque l’indicateur de remplacement est défini. - Le
Filenameest le nom du fichier qui doit exécuter la commande.
Examinons les paramètres et drapeaux couramment utilisés pour utiliser la commande sed pour rechercher et remplacer du texte dans des fichiers. Nous utiliserons le fichier d’exemple que nous avons créé à des fins de démonstration, c’est-à-dire live.txt.
live.txt
Omicron is the endgame of Covid and Omicron 9876
Si le drapeau g est ignoré, seule la première instance de la chaîne de recherche dans chaque ligne est remplacée.
$ sed -e 's/endgame/infinitywar/' live.txt
Production :
Omicron is the infinitywar of Covid and Omicron 9876
Le sed remplace toutes les occurrences du motif de recherche par le drapeau de remplacement global :
$ sed -e 's/Omicron/thanos/g' live.txt
Production :
thanos is the endgame of Covid and thanos 9876
Comme vous avez pu le constater, la chaîne Omicron a été remplacée par thanos.
Rechercher et remplacer le caractère délimiteur / dans une chaîne dans Bash
Vous devez utiliser la barre oblique inverse \ pour échapper à la barre oblique si vous souhaitez découvrir et remplacer une chaîne contenant le caractère délimiteur /. Par exemple, pour remplacer /bin/bash par /usr/bin/zsh, utilisez ce qui suit :
$ sed -e 's/\/bin\/bash/\/usr\/bin\/zsh/g' live.txt
Production :
Omicron is the endgame of Covid and Omicron 9876
Facilitons la compréhension en utilisant une barre verticale | ou un deux-points :, bien que tout autre caractère suffise.
$ sed -e 's|/bin/bash|/usr/bin/zsh|g' live.txt
Production :
Omicron is the endgame of Covid and Omicron 9876
Comme vous pouvez le voir, le résultat est identique au précédent.
Trouvez tous les nombres et remplacez-les par le numéro de chaîne dans Bash
Les expressions régulières peuvent également trouver les quatre nombres et les remplacer par le numéro de la chaîne. Par example:
$ sed -e 's/\b[0-9]\{4\}\b/number/g' live.txt
Production :
Omicron is the endgame of Covid, and Omicron number
Comme vous pouvez le voir, le 9876 est remplacé par la chaîne number.
Enfin, chaque fois que vous utilisez sed pour modifier un fichier, vous devez toujours faire une sauvegarde. Donnez à l’option -i une extension pour le fichier de sauvegarde pour accomplir cela.
Par exemple, modifiez live.txt et enregistrez le fichier d’origine sous live.txt. Si vous deviez utiliser bak, vous le feriez en :
$ sed -i.bak 's/Omicron/thanos/g' live.txt
Listez les fichiers avec la commande ls pour vous assurer que la sauvegarde a été créée :
$ ls
Production :
live.txt
live.txt.bak
Bien que cela puisse paraître compliqué au premier abord, trouver et modifier le texte dans les fichiers avec sed est relativement simple.