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


  • FrançaisFrançais


  • 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 sedun é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.

    Rechercher et remplacer du texte dans un fichier sous Linux

    Utiliser sedvous 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 sedspé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 clean

    all: game

    game: game.o
            $(CC) $(CFLAGS) -o game game.o $(LDFLAGS)

    run: game
            ./game

    clean:
            $(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 clean

    all: life

    life: life.o
            $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)

    run: life
            ./life

    clean:
            $(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 sedvous 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.

    Source

    La Rédaction

    L'équipe rédactionnnelle du site

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    Copy code