Rechercher et remplacer des chaînes complexes en utilisant Sed avec Regex

Nilesh Katuwal 30 janvier 2023
  1. Rechercher et remplacer des chaînes à l’aide de sed dans Bash
  2. Rechercher et remplacer le caractère délimiteur / dans une chaîne dans Bash
  3. Trouvez tous les nombres et remplacez-les par le numéro de chaîne dans Bash
Rechercher et remplacer des chaînes complexes en utilisant Sed avec Regex

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 une regex 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. Le sed lit le fichier ligne par ligne par défaut et ne modifie que la première occurrence du Search_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.