Welcome to Our Website

Les bases de L’utilisation de L’éditeur de flux sed pour manipuler du texte sous Linux

Introduction

la commandesed, abréviation de stream editor, effectue des opérations d’édition sur du texte provenant d’une entrée standard ou d’un fichier. sed modifie ligne par ligne et de manière non interactive.

cela signifie que vous prenez toutes les décisions d’édition lorsque vous appelez la commande, etsed exécute automatiquement les instructions., Cela peut sembler déroutant ou peu intuitif, mais c’est un moyen très puissant et rapide de transformer du texte, en particulier dans le cadre d’un script ou d’un flux de travail automatisé.

Ce tutoriel couvrira quelques opérations de base et vous présentera la syntaxe requise pour faire fonctionner cet éditeur. Vous ne remplacerez presque certainement jamais votre éditeur de texte habituel par sed, mais il deviendra probablement un ajout bienvenu à votre boîte à outils d’édition de texte.

Remarque: Ce tutoriel utilise la version GNU de sed trouvée sur Ubuntu et d’autres systèmes D’exploitation Linux., Si vous utilisez macOS, vous aurez la version BSD qui a différentes options et arguments. Vous pouvez installer la version GNU de sedavec Homebrew en utilisantbrew install gnu-sed.

lancez une borne Interactive!

Utilisation de Base

sed fonctionne sur un flux de texte qu’il lit à partir d’un fichier texte ou de l’entrée standard (STDIN). Cela signifie que vous pouvez envoyer la sortie d’une autre commande directement dans sed pour l’édition, ou vous pouvez travailler sur un fichier que vous avez déjà créées.,

Vous devez également savoir quesed renvoie tout à la sortie standard (STDOUT) par défaut. Cela signifie que, à moins d’redirigé, sed va imprimer sa sortie à l’écran au lieu de l’enregistrer dans un fichier.

L’utilisation de base est:

  • sed commands

Dans ce didacticiel, vous allez utiliser une copie du Logiciel BSD Licence d’expérimenter avec des sed., Sous Ubuntu, Exécutez les commandes suivantes pour copier le fichier de licence BSD dans votre répertoire personnel afin de pouvoir l’utiliser:

  • cd
  • cp /usr/share/common-licenses/BSD .

Si vous n’avez pas de copie locale de la licence BSD, créez-en une vous-même avec cette commande:

  • cat << 'EOF' > BSD
  • Copyright (c) The Regents of the University of California.
  • All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
  • 1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
  • 2. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in the
  • documentation and/or other materials provided with the distribution.
  • 3. Neither the name of the University nor the names of its contributors
  • may be used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  • ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  • IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  • ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  • FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  • DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  • OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  • HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  • OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  • SUCH DAMAGE.
  • EOF

utilisons sed pour afficher le contenu du fichier de licence BSD. sed envoie ses résultats à l’écran par défaut, ce qui signifie que vous pouvez l’utiliser comme lecteur de fichiers en ne lui passant aucune commande d’édition., Essayez d’exécuter la commande suivante:

  • sed '' BSD

Vous verrez la licence BSD affiché à l’écran:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.......

Les guillemets simples contiennent les commandes d’édition de passer sed. Dans ce cas, vous ne lui avez rien transmis, donc sed a imprimé chaque ligne reçue en sortie standard.

sed peut utiliser une entrée standard plutôt qu’un fichier., Tuyau de la sortie de la cat commande: sed pour produire le même résultat:

  • cat BSD | sed ''

Vous verrez la sortie du fichier:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

Comme vous pouvez le voir, vous pouvez agir sur des fichiers ou des flux de données de texte, comme ceux produits lors de la tuyauterie de sortie avec la pipe (|) caractère tout aussi facilement.

lignes D’impression

dans l’exemple précédent, vous avez vu que l’entrée passée danssed sans aucune opération imprimerait les résultats directement sur la sortie standard.,

explorons la commandesedexpliciteprint, que vous spécifiez en utilisant le caractèrep entre guillemets simples.

exécutez la commande suivante:

  • sed 'p' BSD

vous verrez chaque ligne du fichier BSD imprimé Deux fois:

Output
Copyright (c) The Regents of the University of California.Copyright (c) The Regents of the University of California.All rights reserved.All rights reserved.Redistribution and use in source and binary forms, with or withoutRedistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsmodification, are permitted provided that the following conditionsare met:are met:. . .. . .

sed imprime automatiquement chaque ligne par défaut, puis vous lui avez dit d’imprimer des lignes explicitement avec la commande « P”, de sorte que chaque ligne est imprimée deux fois.,

Si vous examinez la sortie de près, vous verrez qu’elle a la première ligne deux fois, suivie de la deuxième ligne deux fois, etc., ce qui vous indique quesed fonctionne ligne par ligne. Il lit une ligne, opère dessus et sort le texte résultant avant de répéter le processus sur la ligne suivante.

Vous pouvez nettoyer les résultats en passant par le -n option sed, qui supprime l’impression automatique:

  • sed -n 'p' BSD
Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditionsare met:1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.. . .. . .

maintenant, Nous sommes de retour pour l’impression de chaque ligne une fois.,

Les exemples jusqu’à présent peuvent difficilement être considérés comme des modifications (sauf si vous vouliez imprimer chaque ligne deux fois twice). Ensuite, vous explorerez comment sed peut modifier la sortie en ciblant des sections spécifiques des données texte.

utiliser des plages D’adresses

Les adresses vous permettent de cibler des parties spécifiques d’un flux de texte. Vous pouvez spécifier une ligne spécifique ou même une plage de lignes.

laissonssed Imprimer la première ligne du fichier., Exécutez la commande suivante:

  • sed -n '1p' BSD

La première ligne affiche à l’écran:

Output
Copyright (c) The Regents of the University of California.

En plaçant le nombre 1 avant la commande d’impression, vous avez dit: sed le numéro de la ligne à opérer. Vous pouvez facilement imprimer des cinq lignes (ne pas oublier le « -n”):

  • sed -n '1,5p' BSD

Vous verrez ce résultat:

Output
Copyright (c) The Regents of the University of California.All rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions

Vous venez de donner une plage d’adresses sed., Si vous donnez une adresse à sed, il n’exécutera que les commandes qui suivent sur ces lignes. Dans cet exemple, vous avez dit à sed d’Imprimer la ligne 1 à la ligne 5. Vous auriez pu spécifier cela d’une manière différente en donnant la première adresse, puis en utilisant un décalage pour indiquer à sed le nombre de lignes supplémentaires à parcourir, comme ceci:

  • sed -n '1,+4p' BSD

cela entraînera la même sortie, car vous avez dit à sed de commencer à la ligne 1, puis,

Si vous souhaitez imprimer toutes les autres, spécifiez l’intervalle après la balise ~ caractère. La commande suivante imprime toutes les autres lignes du fichier BSD, en commençant par la ligne 1:

  • sed -n '1~2p' BSD

Voici la sortie que vous verrez:

Output
Copyright (c) The Regents of the University of California.modification, are permitted provided that the following conditions1. Redistributions of source code must retain the above copyright2. Redistributions in binary form must reproduce the above copyright documentation and/or other materials provided with the distribution. may be used to endorse or promote products derived from this software. . .. . .

Vous pouvez utiliser sed pour supprimer également du texte de la sortie.,

suppression de texte

Vous pouvez effectuer une suppression de texte là où vous spécifiez précédemment l’impression de texte en remplaçant la commandep par la commanded.

Dans ce cas, vous n’avez plus besoin de la balise -n commande car sed imprime tout ce qui n’est pas supprimé. Cela vous aidera à voir ce qui se passe.,

Modifiez la dernière commande de la section précédente pour la faire
supprimer toutes les autres lignes en commençant par la première:

  • sed '1~2d' BSD

le résultat est que vous voyez toutes les lignes qui ne vous ont pas été données la dernière fois:

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

Il est important de Il est encore intacte. Les modifications sont affichées sur notre écran.,

Si nous voulons enregistrer nos modifications, nous pouvons rediriger la sortie standard vers un fichier comme suit:

  • sed '1~2d' BSD > everyother.txt

ouvrez maintenant le fichier avec cat:

  • cat everyother.txt

vous voyez la même sortie que vous avez vu à

Output
All rights reserved.Redistribution and use in source and binary forms, with or withoutare met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the3. Neither the name of the University nor the names of its contributors without specific prior written permission.. . .. . .

la commande sed ne modifie pas le fichier source par défaut, mais vous pouvez modifier ce comportement en passant l’option -i, ce qui signifie « effectuer des modifications sur place.” Cela va modifier le fichier source.,

avertissement: L’utilisation du commutateur-i écrasera le fichier d’origine, vous devez donc l’utiliser avec précaution. Effectuez les opérations sans -i commutez d’abord, puis exécutez à nouveau la commande avec -i une fois que vous avez ce que vous voulez, créez une sauvegarde du fichier d’origine ou redirigez la sortie vers un fichier. Il est très facile de modifier accidentellement le fichier d’origine avec le commutateur -i.

essayons-le en éditant le fichiereveryother.txt que vous venez de créer, en place., Laissez réduire encore plus le fichier en supprimant tous les autres la ligne
encore une fois:

  • sed -i '1~2d' everyother.txt

Si vous utilisez cat pour afficher le fichier avec cat everyother.txt, vous verrez que le fichier a été modifié.

l’option-i peut être dangereuse. Heureusement, sed vous donne la possibilité de créer un fichier de sauvegarde avant l’édition.,

pour créer un fichier de sauvegarde avant la modification, ajoutez l’extension de sauvegarde directement après l’option « -i”:

  • sed -i.bak '1~2d' everyother.txt

cela crée un fichier de sauvegarde avec l’extension.bak, puis modifie le fichier d’origine sur place.

Ensuite, vous découvrirez comment utiliser des sed pour effectuer des opérations de recherche et remplacement.

remplacer le texte

L’utilisation la plus connue desed consiste peut-être à remplacer le texte., sed peut rechercher des motifs de texte à l’aide d’expressions régulières, puis remplacer le texte trouvé par autre chose.

Vous pouvez en savoir plus sur les expressions régulières en suivant la section Utilisation des Expressions régulières Grep pour rechercher des motifs de texte sous Linux.

dans sa forme la plus basique, vous pouvez changer un mot en un autre en utilisant la syntaxe suivante:

's/old_word/new_word/'

Les est la commande de substitution. Les trois barres obliques (/) sont utilisées pour séparer les différents champs de texte., Vous pouvez utiliser d’autres caractères pour délimiter les champs si il serait plus utile.

par exemple, si vous essayez de changer le nom d’un site web, l’utilisation d’un autre délimiteur serait utile car les URL contiennent des barres obliques.

Exécutez la commande suivante pour imprimer une URL avec des echo et de le modifier avec des sed, en utilisant le trait de soulignement (_) caractère délimiteur:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home_'

remplace com/index par org/home., La sortie affiche l’URL modifiée:

Output

Do not forget the final delimiter, or sed will complain. If you ran this command:

  • echo "http://www.example.com/index.html" | sed 's_com/index_org/home'

vous verriez cette sortie:

Output
sed: -e expression #1, char 20: unterminated `s' command

créons un nouveau fichier pour pratiquer certaines substitutions. Exécutez la commande suivante pour créer un nouveau fichier texte appelé song.txt:

  • echo "this is the song that never ends
  • yes, it goes on and on, my friend
  • some people started singing it
  • not knowing what it was
  • and they'll continue singing it forever
  • just because..." > song.txt

Maintenant, nous allons remplacer l’expression on par forward. Utilisez la commande suivante:

  • sed 's/on/forward/' song.txt

La sortie ressemble à ceci:

Output
this is the sforwardg that never endsyes, it goes forward and on, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Vous pouvez voir quelques notables de choses ici., Tout d’abord, est-ce que sed a remplacé les Modèles, pas les mots. La balise on dans un song est remplacé par forward.

L’autre chose à noter est que sur la ligne 2, le deuxième on n’a pas changé de forward.

en effet, par défaut, la commandes fonctionne sur la première correspondance d’une ligne, puis passe à la ligne suivante., Pour que sed remplace chaque instance de on au lieu de la première de chaque ligne, vous devez passer un indicateur facultatif à la commande substitute.

Fournir le g drapeau de la commande de substitution en le plaçant après le jeu de substitution:

  • sed 's/on/forward/g' song.txt

Vous verrez ce résultat:

Output
this is the sforwardg that never endsyes, it goes forward and forward, my friendsome people started singing itnot knowing what it wasand they'll cforwardtinue singing it foreverjust because...

Maintenant, la commande de substitution change chaque instance.,

Si vous vouliez seulement changer la deuxième instance de « on” Que sed trouve sur chaque ligne, alors vous utiliseriez le nombre 2 au lieu du g:

  • sed 's/on/forward/2' song.txt

Cette fois, les autres lignes sont inchangées, car elles n’ont pas de seconde occurrence:

Output
this is the song that never endsyes, it goes on and forward, my friendsome people started singing itnot knowing what it wasand they'll continue singing it foreverjust because...

Si vous voulez seulement voir quelles lignes ont été substituées, utilisez à nouveau l’option -n pour supprimer l’impression automatique.,

Vous pouvez ensuite passer l’optionp à la commande substitute pour imprimer les lignes où la substitution a eu lieu.

  • sed -n 's/on/forward/2p' song.txt

La ligne qui a changé imprime à l’écran:

Output
yes, it goes on and forward, my friend

Comme vous pouvez le voir, vous pouvez combiner les drapeaux à la fin de la commande.

Si vous voulez que le processus de recherche ignore la casse, vous pouvez lui passer le drapeau « i”.,

  • sed 's/SINGING/saying/i' song.txt

Voici la sortie que vous verrez:

Output
this is the song that never endsyes, it goes on and on, my friendsome people started saying itnot knowing what it wasand they'll continue saying it foreverjust because...

remplacement et Référencement du texte apparié

Si vous voulez trouver des modèles plus complexes avec des expressions régulières, vous avez un certain nombre de méthodes différentes pour référencer le modèle apparié dans le texte de remplacement.,

Par exemple, pour correspondre depuis le début de la ligne at, utilisez la commande suivante:

  • sed 's/^.*at/REPLACED/' song.txt

Vous verrez cette sortie:

Output
REPLACED never endsyes, it goes on and on, my friendsome people started singing itREPLACED it wasand they'll continue singing it foreverjust because...

Vous pouvez voir que l’expression générique de matches depuis le début de la ligne jusqu’à la dernière instance de at.

puisque vous ne connaissez pas la phrase exacte qui correspondra dans la chaîne de recherche, vous pouvez utiliser le caractère& pour représenter le texte correspondant dans la chaîne de remplacement.,

mettons des parenthèses autour du texte correspondant:

  • sed 's/^.*at/(&)/' song.txt

Vous verrez cette sortie:

Output
(this is the song that) never endsyes, it goes on and on, my friendsome people started singing it(not knowing what) it wasand they'll continue singing it foreverjust because...

Une façon plus flexible de référencer le texte correspondant est d’utiliser des parenthèses échappées pour regrouper des sections de texte correspondant.

chaque groupe de texte de recherche marqué de parenthèses peut être référencé par un numéro de référence échappé. Par exemple, le premier groupe de parenthèses peut être référencé avec \1, le second avec \2 et ainsi de suite.,

Dans cet exemple, nous allons basculer les deux premiers mots de chaque ligne:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Vous verrez ce résultat:

Output
is this the song that never endsyes, goes it on and on, my friendpeople some started singing itknowing not what it wasthey and'll continue singing it foreverbecause just...

Comme vous pouvez le voir, les résultats ne sont pas parfaits. Par exemple, la deuxième ligne ignore le premier mot car il a un caractère non répertorié dans notre jeu de caractères. De même, il a traité they'll comme deux mots dans la cinquième ligne.

nous allons améliorer l’expression régulière pour être plus précis:

  • sed 's/\(*\) \(*\)/\2 \1/' song.txt

Vous verrez ce résultat:

Output
is this the song that never endsit yes, goes on and on, my friendpeople some started singing itknowing not what it wasthey'll and continue singing it foreverbecause... just

C’est beaucoup mieux que la dernière fois., Cela regroupe la ponctuation avec le mot associé.

notez comment nous répétons l’expression à l’intérieur des parenthèses (une fois sans le caractère*, puis une fois avec lui). En effet, le caractère* correspond au jeu de caractères qui le précède zéro ou plusieurs fois. Cela signifie que la correspondance avec le caractère générique serait considérée comme une « correspondance” même si le motif n’est pas trouvé.

Pour vous assurer que sed trouve le texte au moins une fois, vous devez faire correspondre une fois sans le générique avant d’utiliser le caractère générique.,

Conclusion

Dans ce tutoriel, vous exploré la balise sed commande. Vous avez imprimé des lignes spécifiques du fichier, recherché du texte, supprimé des lignes, remplacé le fichier d’origine et utilisé des expressions régulières pour remplacer le texte. Vous devriez être en mesure de voir déjà comment vous pouvez transformer rapidement un document texte en utilisant des commandes sed correctement construites.

dans le prochain article de cette série, vous explorerez quelques fonctionnalités plus avancées.

Laisser un commentaire

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