Rechercher et remplacer des chaînes complexes en utilisant Sed avec Regex
-
Rechercher et remplacer des chaînes à l’aide de
sed
dans 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
-e
est la sortie de sed écrite sur la sortie standard par défaut. Ce paramètre demande àsed
de 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_Regex
est un pour rechercher quelque chose. Nous utiliserons uneregex
ou une chaîne régulière. - La
substitution
est utilisée comme des chaînes à substituer. - Le
g
est un drapeau de substitution globale. Lesed
lit le fichier ligne par ligne par défaut et ne modifie que la première occurrence duSearch_Regex
sur chaque ligne. Toutes les instances sont remplacées lorsque l’indicateur de remplacement est défini. - Le
Filename
est 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.