Comment j’utilise la commande Linux sed pour automatiser les modifications de fichiers

Lorsque j’utilise la ligne de commande Linux, que j’écrive un nouveau programme sur mon ordinateur de bureau ou que je gère un site Web sur mon serveur Web, j’ai souvent besoin de traiter des fichiers texte. Linux fournit des outils puissants que j’utilise pour faire mon travail. j’utilise fréquemment sed
un éditeur qui peut modifier du texte selon un modèle.
sed
représente éditeur de flux, et il modifie le texte dans un fichier et imprime les résultats. Une façon d’utiliser sed
consiste à identifier plusieurs occurrences d’une chaîne dans un fichier et à les remplacer par une chaîne différente. Vous pouvez utiliser sed
pour traiter des fichiers texte à un degré apparemment sans fin, mais j’aimerais partager quelques façons dont j’utilise sed
pour m’aider à gérer les fichiers.
Contents
Rechercher et remplacer du texte dans un fichier sous Linux
Utiliser sed
vous devez utiliser un expression régulière. Une expression régulière est un ensemble de caractères spéciaux qui définissent un modèle. Mon exemple le plus fréquent d’utilisation sed
remplace du texte dans un fichier. La syntaxe de remplacement de texte ressemble à ceci : s/originaltext/newtext/
. La s
indique à sed d’effectuer un remplacement de texte ou d’échanger des occurrences de texte. Indiquez le texte d’origine et le nouveau texte entre les barres obliques.
Cette syntaxe ne remplacera que la première occurrence de originaltext
sur chaque ligne. Pour remplacer chaque occurrence, même si le texte d’origine apparaît plusieurs fois sur une ligne, ajoutez g
jusqu’à la fin de l’expression. Voici un exemple: s/originaltext/newtext/g
.
Pour l’utiliser avec sed
spécifiez cette expression régulière avec le -e
option:
$ sed -e 's/originaltext/newtext/g'
Par exemple, disons que j’ai un Makefile pour un programme appelé Jeuqui simule le jeu de la vie de Conway :
.PHONY: all run cleanall: game
game: game.o
$(CC) $(CFLAGS) -o game game.o $(LDFLAGS)run: game
./gameclean:
$(RM) *~
$(RM) *.o
$(RM) game
Le nom Jeu n’est pas très descriptif, je pourrais donc choisir de le renommer la vie. Renommer le game.c
fichier source à life.c
est assez simple, mais maintenant je dois modifier le Makefile pour utiliser le nouveau nom. je peux utiliser sed
changer chaque occurrence de Jeu à la vie:
$ sed -e 's/game/life/g' Makefile
.PHONY: all run cleanall: life
life: life.o
$(CC) $(CFLAGS) -o life life.o $(LDFLAGS)run: life
./lifeclean:
$(RM) *~
$(RM) *.o
$(RM) life
Cela imprime le sed
sortie à l’écran, ce qui est un bon moyen de vérifier si le remplacement de texte fera ce que vous voulez. Pour apporter ces modifications au Makefile, faites d’abord une sauvegarde du fichier, puis exécutez sed
et enregistrez la sortie dans le nom de fichier d’origine :
$ cp Makefile Makefile.old
$ sed -e 's/game/life/g' Makefile.old > Makefile
Si vous êtes sûr que vos modifications correspondent exactement à ce que vous souhaitez, utilisez le -i
ou --in-place
possibilité de modifier le fichier en place. Cependant, je recommande d’ajouter un suffixe de nom de fichier de sauvegarde comme --in-place=.old
pour enregistrer une copie du fichier d’origine au cas où vous auriez besoin de le restaurer ultérieurement. Il ressemble à ceci :
$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile Makefile.old
Citation de fichiers avec sed sous Linux
Vous pouvez utiliser d’autres fonctionnalités des expressions régulières pour faire correspondre des instances spécifiques de texte. Par exemple, vous devrez peut-être remplacer le texte qui apparaît au début d’une ligne. Avec sed
vous pouvez faire correspondre le début d’une ligne avec ^le caractère caret.
L’une des façons dont j’utilise “début de ligne” pour remplacer du texte est lorsque j’ai besoin de citer un fichier dans un e-mail. Disons que je veux partager mon Makefile dans un e-mail, mais je ne veux pas l’inclure en tant que pièce jointe. Au lieu de cela, je préfère “citer” le fichier dans le corps d’un e-mail, en utilisant > avant chaque ligne. je peux utiliser ce qui suit sed
commande pour imprimer une version modifiée sur mon terminal, que je peux copier et coller dans un nouvel e-mail :
$ sed -e 's/^/>/' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
La s/^/>/
expression régulière correspond au début de chaque ligne (^) et place un > là. Effectivement, cela commence chaque ligne avec le > symbole.
Les onglets peuvent ne pas s’afficher correctement dans un e-mail, mais je peux remplacer tous les onglets du Makefile par quelques espaces en ajoutant une autre expression régulière :
$ sed -e 's/^/>/' -e 's/\t/ /g' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
La \t
indique une tabulation littérale, donc s/\t/ /g
indique à sed de remplacer toutes les tabulations de l’entrée par deux espaces dans la sortie.
Si vous devez appliquer de nombreuses modifications aux fichiers, vous pouvez enregistrer votre -e
commandes dans un fichier et utiliser -f
dire sed
pour utiliser ce fichier comme “script”. Cette approche est particulièrement utile si vous devez effectuer fréquemment les mêmes modifications. J’ai peut-être préparé le Makefile pour le citer dans un courrier électronique à l’aide d’un fichier de script appelé quotemail.sed
:
$ cat quotemail.sed
s/^/>/
s/\t/ /g
$ sed -f quotemail.sed Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
> $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
> ./life
>
>clean:
> $(RM) *~
> $(RM) *.o
> $(RM) life
Apprendre à travailler avec sed sous Linux
sed
est un excellent outil à conserver dans votre boîte à outils de ligne de commande Linux. Explore le sed
page de manuel et apprenez-en plus sur son utilisation. Taper man sed
à la ligne de commande pour obtenir une documentation complète sur les différentes options de ligne de commande et comment utiliser sed
pour traiter les fichiers texte.