lorsque vous travaillez avec des fichiers texte, vous devrez souvent trouver 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 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 motifs complexes.,
dans cet article, nous allons parler de la façon de trouver et de remplacer les chaînes par sed
. Nous allons également vous montrer comment effectuer une recherche récursive et remplacer.
rechercher et remplacer la chaîne par sed #
Il existe plusieurs versions desed
, avec quelques différences fonctionnelles entre elles. macOS utilise la version BSD, alors que la plupart des distributions Linux sont fournies avec GNU sed
préinstallé par défaut. Nous utiliserons la version GNU.,
la forme générale de La recherche et remplacement de texte à l’aide de sed
prend la forme suivante:
sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE
-
-i
Par défaut, la balisesed
écrit sa sortie sur la sortie standard. Cette option indique àsed
de modifier les fichiers en place. Si une extension est fournie (ex-I. bak), une sauvegarde du fichier d’origine est 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 slash () est utilisé. -
SEARCH_REGEX
– chaîne normale ou une expression régulière à rechercher. -
REPLACEMENT
– La chaîne de remplacement. -
g
– indicateur de remplacement Global. Par défaut,sed
lit le fichier ligne par ligne et modifie uniquement la première occurrence de la baliseSEARCH_REGEX
sur une ligne. Lorsque l’indicateur de remplacement est fourni, toutes les occurrences sont remplacées., -
INPUTFILE
– Le nom du fichier sur lequel vous voulez exécuter la commande.
c’est une bonne pratique de mettre des guillemets autour de l’argument afin que les méta-caractères du shell ne se développent pas.
voyons comment utiliser la commandesed
pour rechercher et remplacer le texte dans les fichiers avec certaines de ses options et drapeaux les plus couramment utilisés.
à des fins de démonstration, nous utiliserons le fichier suivant:
123 Foo foo foo foo /bin/bash Ubuntu foobar 456
Si le g
drapeau est omis, seule la première occurrence de la chaîne de recherche dans chaque ligne est remplacée:
sed -i 's/foo/linux/' file.txt
123 Foo linux foo linux /bin/bash Ubuntu foobar 456
Avec le remplacement global drapeau sed
remplace toutes les occurrences du motif de recherche:
sed -i 's/foo/linux/g' file.txt
123 Foo linux linuxlinux /bin/bash Ubuntu linuxbar 456
Comme vous l’avez peut-être remarqué, la sous-chaîne foo
à l’intérieur de la balise foobar
string est également remplacé dans l’exemple précédent., Si ce n’est pas le comportement recherché, utilisez l’expression word-boundary (\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 linuxlinux /bin/bash Ubuntu foobar 456
afin De rendre le modèle correspondent à la casse, utilisez la balise I
drapeau., Dans l’exemple ci-dessous, nous utilisons à la fois le g
et I
drapeaux:
sed -i 's/foo/linux/gI' file.txt
123 linux linux linux linux /bin/bash Ubuntu linuxbar 456
Si vous voulez rechercher et remplacer une chaîne de caractères qui contient le caractère délimiteur (/
) vous aurez besoin d’utiliser la barre oblique inverse (\
) pour échapper à la barre. Par exemple pour remplacer les /bin/bash
par /usr/bin/zsh
vous utilisez
sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt
Le plus facile et beaucoup plus lisible option est d’utiliser un autre caractère délimiteur., La plupart des gens utilisent la barre verticale (|
) ou du côlon (:
), 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 tous les 3 chiffres et de les remplacer par la chaîne number
vous pouvez utiliser:
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 &
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, type:
sed -i 's/\b\{3\}\b/{&}/g' file.txt
{123} Foo foo foo foo /bin/bash demo foobar {456}
Dernier point mais non le moindre, c’est toujours une bonne idée de faire une sauvegarde lors de l’édition d’un fichier avec sed
. Pour ce faire, il suffit de fournir une extension pour le fichier de sauvegarde à l’option -i
., Par exemple, pour modifier le file.txt
et enregistrer le fichier d’origine sous file.txt.bak
vous utiliseriez:
sed -i.bak 's/foo/linux/g' file.txt
pour vous assurer que la sauvegarde est créée, listez les fichiers avec la commande ls
:
ls
file.txt file.txt.bak
recherche récursive et remplacement #
parfois, vous pouvez 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 canaliser les noms de fichiers à sed
.
la commande suivante recherchera récursivement les 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 Div>en utilisant xargs -0
:
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
pour exclure un répertoire, utilisez l’option-not -path
.,si vous souhaitez rechercher et remplacer du texte uniquement sur des fichiers avec une extension spécifique, vous utiliserez:
find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'
Une autre option consiste à utiliser le
find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'
Si vous souhaitez rechercher et remplacer du texte uniquement sur des fichiers avec 80a3a776de »> commande pour rechercher récursivement tous les fichiers contenant le motif de recherche, puis rediriger les noms de fichiers verssed
:
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 19d58b9d24″> est très simple.,
pour en savoir plus sur sed
commandes, options et indicateurs, visitez le manuel GNU sed et le tutoriel Grymoire sed .
Leave a Reply