Android

Comment utiliser sed pour rechercher et remplacer une chaîne dans des fichiers

Tutoriel Word 2013 - Remplacer automatiquement des mots dans un texte

Tutoriel Word 2013 - Remplacer automatiquement des mots dans un texte

Table des matières:

Anonim

Très souvent, lorsque vous travaillez avec des fichiers texte, vous devrez rechercher et remplacer des chaînes de texte dans un ou plusieurs fichiers.

sed est un éditeur de trames. Il peut effectuer une manipulation de texte de base sur des fichiers et des flux d'entrée tels que des pipelines. Avec sed vous pouvez rechercher, trouver et remplacer, insérer et supprimer des mots et des lignes. Il prend en charge les expressions régulières de base et étendues qui vous permettent de faire correspondre des modèles complexes.

, nous verrons comment trouver et remplacer des chaînes par sed . Nous vous montrerons également comment effectuer une recherche récursive et remplacer.

Rechercher et remplacer une chaîne par sed

Il existe plusieurs versions de sed , avec quelques différences fonctionnelles entre elles. macOS utilise la version BSD et la plupart des distributions Linux sont livrées avec GNU sed pré-installé par défaut. Nous utiliserons la version GNU.

La forme générale de recherche et de remplacement de texte à l'aide de sed prend la forme suivante:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Par défaut, sed écrit sa sortie sur la sortie standard. Cette option indique à sed de modifier les fichiers sur place. Si une extension est fournie (ex -i.bak), une sauvegarde du fichier d'origine sera créée. s - La commande de substitution, probablement la commande la plus utilisée dans sed. / / / - Caractère délimiteur. Il peut s'agir de n'importe quel caractère mais généralement le caractère barre oblique ( / ) est utilisé. SEARCH_REGEX - Chaîne normale ou expression régulière à rechercher. REPLACEMENT - La chaîne de remplacement. g - Drapeau de remplacement global. Par défaut, sed lit le fichier ligne par ligne et ne modifie que la première occurrence de SEARCH_REGEX sur une ligne. Lorsque le drapeau de remplacement est fourni, toutes les occurrences seront remplacées. INPUTFILE - Le nom du fichier sur lequel vous souhaitez exécuter la commande.

C'est une bonne pratique de mettre des guillemets autour de l'argument pour que les méta-caractères du shell ne se développent pas.

Voyons des exemples d'utilisation de la commande sed pour rechercher et remplacer du texte dans des fichiers par certaines de ses options et indicateurs les plus couramment utilisés.

À des fins de démonstration, nous utiliserons le fichier suivant:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Avec le drapeau de remplacement global sed remplace toutes les occurrences du modèle de recherche:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Comme vous l'avez peut-être remarqué, dans l'exemple précédent, la sous-chaîne foo à l'intérieur de la chaîne foobar est également remplacée. Si ce n'est pas le comportement souhaité, utilisez l'expression de délimitation de mot ( \b ) aux deux extrémités de la chaîne de recherche. Cela garantit que les mots partiels ne correspondent pas.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Pour rendre la correspondance de motifs insensible à la casse, utilisez l'indicateur I Dans l'exemple ci-dessous, nous utilisons les drapeaux g et I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

L'option la plus simple et beaucoup plus lisible consiste à utiliser un autre caractère de délimitation. La plupart des gens utilisent la barre verticale ( | ) ou les deux points (:) mais vous pouvez utiliser n'importe quel autre caractère:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Vous pouvez également utiliser des expressions régulières. Par exemple, pour rechercher les trois chiffres et les remplacer par le number chaîne que vous utiliseriez:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Une autre caractéristique utile de sed est que vous pouvez utiliser le caractère esperluette & qui correspond au motif correspondant. Le personnage peut être utilisé plusieurs fois.

Par exemple, si vous souhaitez ajouter des accolades {} autour de chaque nombre à 3 chiffres, tapez:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Enfin, c'est toujours une bonne idée de faire une sauvegarde lors de l'édition d'un fichier avec sed . Pour ce faire, fournissez simplement une extension à l'option -i . Par exemple, pour modifier le file.txt et enregistrer le fichier d'origine en tant que file.txt.bak vous utiliseriez:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Recherche et remplacement récursifs

Parfois, vous souhaitez rechercher récursivement dans les répertoires des fichiers contenant une chaîne et remplacer la chaîne dans tous les fichiers. Cela peut être fait en utilisant des commandes telles que find ou grep pour rechercher récursivement des fichiers dans le répertoire et en redirigeant les noms de fichiers vers sed .

La commande suivante recherchera récursivement des fichiers dans le répertoire de travail actuel et transmettra les noms de fichiers à sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Pour éviter les problèmes avec les fichiers contenant de l'espace dans leurs noms, utilisez l'option -print0 qui indique à find d'imprimer le nom du fichier, suivi d'un caractère nul et de diriger la sortie vers sed aide de xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Pour exclure un répertoire, utilisez l'option -not -path . Par exemple, si vous remplacez une chaîne dans votre référentiel git local pour exclure tous les fichiers commençant par un point ( . ), Utilisez:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Une autre option consiste à utiliser la commande grep pour rechercher récursivement tous les fichiers contenant le modèle de recherche, puis diriger les noms de fichiers vers sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Conclusion

Bien que cela puisse sembler compliqué et complexe, au début, la recherche et le remplacement de texte dans des fichiers par sed est très simple.

Pour en savoir plus sur les commandes, les options et les indicateurs sed, visitez le manuel GNU sed et le tutoriel Grymoire sed. Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.

terminal sed