logo

Commande Sed sous Linux/Unix avec exemples

La commande Linux 'sed' signifie éditeur de flux. Il est utilisé pour éditer des flux (fichiers) à l'aide d'expressions régulières. Mais cette édition n'est pas permanente. Il reste uniquement affiché, mais en réalité, le contenu du fichier reste le même.

Principalement, il est utilisé pour la substitution de texte ; en outre, il peut être utilisé pour d'autres opérations de manipulation de texte telles que l'insertion, la suppression, la recherche, etc. La commande sed nous permet d'éditer des fichiers sans les ouvrir. La prise en charge des expressions régulières en fait un outil de manipulation de texte plus puissant.

Présentation de la commande sed

Il s'agit d'un utilitaire Unix qui transforme et analyse le texte avec un langage de programmation compact et simple. Il a été intégré de 1973 à 1974 par Lee E. McMahon des Bell Labs et est aujourd'hui présent pour presque tous les systèmes d'exploitation. La commande sed était basée sur les aspects de script de l'ancien qed (éditeur rapide) et de l'éditeur interactif ed. Il s'agit du premier outil prenant en charge les expressions régulières et reste actif pour le traitement de texte, notamment avec la commande de substitution. Les outils alternatifs célèbres incluent Perl et AWK pour 'édition de flux' et manipulation de chaînes de texte en clair.

Mode de fonctionnement de la commande sed

La commande sed est un utilitaire de traitement de texte orienté ligne : elle lit ligne par ligne le texte d'un fichier ou d'un flux d'entrée dans un tampon interne appelé espace de modèle. Toutes les lectures de lignes commencent un cycle. La commande sed utilise une ou plusieurs opérations qui ont été décrites par un script sed dans l'espace de modèle. Il exploite un langage de programmation utilisant environ 25 commandes qui décrivent les opérations sur le texte.

Pour toutes les lignes d'entrée, la commande sed génère généralement l'espace de modèle et recommence le cycle avec la ligne suivante après l'exécution du script. D'autres natures de fin de script sont disponibles à partir des commandes de script et des options définies, par exemple N pour inclure immédiatement la ligne suivante dans l'espace de modèle, q pour quitter, d pour supprimer l'espace de modèle, et ainsi de suite. Par conséquent, un script sed concerne un corps de boucle qui itère à partir d'un streamline, dans lequel la variable de boucle et la boucle elle-même sont maintenues et implicites par sed.

dactylographié pour chacun
  • Un script sed peut être soit décrit sur la ligne de commande, soit lu via un fichier isolé. Dans le script sed, les commandes peuvent prendre une adresse supplémentaire dans le contexte d'expressions régulières ou de numéros de ligne. L'adresse décide quand la commande est exécutée. Par exemple, 2d exécutera uniquement la commande d (ou delete) sur la 2ème ligne d'entrée, tandis que /^ /d supprimera chaque ligne commençant par un espace.
  • L'espace de maintien, un tampon spécial isolé, peut être utilisé par certaines commandes sed pour conserver un texte accumulé entre les cycles. Le langage de commande de sed n'a que deux variables (espace de motif et espace de maintien) et une fonctionnalité de branchement de type GOTO. Cependant, le langage est Turing-complet. Des scripts sed ésotériques sont disponibles pour plusieurs jeux comme Tetris, les échecs, Arkanoid et Sokoban.
  • La boucle principale s'exécute sur toutes les lignes du flux d'entrée, vérifiant le script sed sur toutes les lignes de l'entrée. Les lignes de script sed sont toutes une paire modèle-action, représentant le modèle à mettre en correspondance et l'action à implémenter, qui peut être copiée en tant qu'instruction conditionnelle. Les actions par défaut (espace de motif d'impression, copie de la ligne dans l'espace de motif), les flux d'entrée et de sortie et les variables de travail (espace de maintien et espace de motif) sont implicites ; il est possible de spécifier des programmes monolignes concis en raison de la boucle principale.

Utilisation de la commande sed

    Commande de remplacement
    L'exemple ci-dessous représente la commande la plus courante et l'utilisation typique de la commande sed, c'est-à-dire la substitution. L'utilisation était la véritable motivation de la commande sed :
    sed 's/regexp/replacement/g' nomFichierentrée > NomFichiersortieAutres commandes de sed
    D'autres méthodes sont également possibles pour un traitement simple avec quelque 25 commandes sed. Par exemple, ci-dessous utilise l'option d pour filtrer les lignes qui incluent uniquement des espaces et la fin du caractère de ligne :
    sed '/^ *$/d' nomFichierentrée
    L'exemple ci-dessus utilise quelques-uns des métacaractères d'expression régulière ci-dessous :
    • Le curseur (^) est identique au début de la ligne.
    • Le symbole du dollar ($) correspond à la fin de la ligne.
    • L'astérisque (*) est identique à l'occurrence de caractère précédente supérieure ou égale à zéro.
    • Le symbole plus (+) est le même que la ou les occurrences de caractères précédentes.
    • Le point d'interrogation (?) est identique à l'occurrence de caractère précédente, supérieure ou égale à zéro.
    • Le symbole point (.) équivaut exactement à un caractère.
    sed comme filtre
    Souvent, la commande sed est utilisée comme filtre dans un pipeline sous Unix :
    $générer des données | sed 's/x/y/g'
    Le programme generateData génère des données et la commande sed apporte une petite modification en remplaçant x à la place de y.Scripts sed basés sur des fichiers
    Souvent, il est utile de placer plusieurs commandes sed, une seule commande par ligne, dans un fichier de script et d'utiliser l'indicateur -f pour exécuter les commandes du fichier :
    sed -f subst.sed nomFichierentrée > NomFichiersortie

Syntaxe:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Possibilités :

Voici quelques options de ligne de commande de la commande sed :

-n, --quiet, --silencieux : Cela nous permet avec force d’imprimer l’espace du motif.

-e script, --expression=script : Il permet d'ajouter le script aux commandes à exécuter.

-f fichier-script, --file=fichier-script : Il est utilisé pour ajouter le contenu du fichier script aux commandes à exécuter.

--follow-symlinks : il est utilisé pour suivre les liens symboliques lors du traitement en place.

-i[SUFFIX], --in-place[=SUFFIX] : il est utilisé pour éditer les fichiers sur place (crée une sauvegarde si l'option SUFFIX est fournie).

-l N, --line-length=N : Il est utilisé pour spécifier la longueur de retour à la ligne souhaitée pour la commande `l'.

--posix : il est utilisé pour désactiver toutes les extensions GNU.

-E, -r, --regexp-extended : Cela nous permet d'utiliser les expressions régulières étendues dans le script (pour la portabilité, utilisez POSIX -E).

la session est expirée

-s, --séparé : il est utilisé pour considérer les fichiers comme séparés plutôt que comme un seul et continue le long flux.

--bac à sable: Il permet de fonctionner en mode sandbox.

-u, --sans tampon : Il est utilisé pour charger les quantités minimales de données des fichiers d'entrée et vider les tampons de sortie plus souvent.

-z, --null-data : Il est utilisé pour séparer les lignes par des caractères NUL.

--aide: il est utilisé pour afficher le manuel d'aide.

--version: Il est utilisé pour afficher les informations de version.

Exemples de commande sed

Voyons les exemples suivants :

Application au répertoire STDIN

La commande sed ne se limite pas uniquement à manipuler des fichiers ; nous pouvons également l'appliquer au répertoire STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

Les commandes ci-dessus remplaceront le premier texte par le deuxième modèle de texte. Considérez le résultat ci-dessous :

Filtre SED Linux

À partir de la sortie ci-dessus, nous avons d'abord exécuté la commande 'sed' sur une chaîne 'class7' où 'class' est changé en 'jtp' et 7 en 10. Ensuite, nous avons exécuté la commande 'sed' sur un flux 'msg.txt ' où 'apprendre' est converti en 'étudier'.

Remplacement global

Dans l'exemple précédent, tous les mots « apprendre » n'ont pas été transformés en « étude ». Pour éditer chaque mot, nous devons utiliser un remplacement global 'g'. Il modifiera tous les mots spécifiés dans un fichier ou une chaîne.

Syntaxe:

 command | sed 's///g' 

Considérez les exemples ci-dessous :

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

Les commandes ci-dessus remplaceront tous les modèles de texte spécifiés. Considérez le résultat ci-dessous :

tutoriel .net
Filtre SED Linux

À partir de la sortie ci-dessus, en exécutant la commande 'echo class7 class9 | sed 's/class/jtp/g'' toute la 'classe' est convertie en 'jtp' et avec la commande 'cat msg.txt | sed 's/learn/study/g'' tout le 'learn' a été converti en 'study'.

Supprimer une ligne

L'option 'd' nous permettra de supprimer une ligne complète d'un fichier. Il nous suffit de spécifier un mot de cette ligne avec l'option 'd', et cette ligne sera supprimée. Mais notez que toutes les lignes ayant ce même mot seront supprimées. Il sera exécuté comme suit :

 cat | sed '//d' 

Considérez la commande ci-dessous :

 cat msg.txt | sed '/jtp/d' 

La commande ci-dessus supprimera les lignes contenant le mot « jtp ». Considérez le résultat ci-dessous :

Filtre SED Linux

À partir de la sortie ci-dessus, en exécutant la commande 'cat msg.txt | sed '/jtp/d'' toutes les lignes contenant le mot 'jtp' sont supprimées.

Utilisation de la commande Multiple sed

L'option '-e' nous permet d'exécuter plusieurs commandes sed à la fois. Nous pouvons effectuer plus d'une opération sed en exécutant la commande comme :

 sed -e ' ; ' 

Considérez la commande ci-dessous :

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

La commande ci-dessus appliquera toutes les opérations spécifiées dans le fichier 'exm.txt'. Considérez le résultat ci-dessous :

Filtre SED Linux

Comme nous pouvons le voir dans le résultat ci-dessus, tous les mots « rouges » sont remplacés par « bleu » et tous les mots « jaunes » sont remplacés par « noir ». On peut également séparer les commandes comme ceci :

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Le résultat sera le même que la commande ci-dessus.

Lire des commandes à partir d'un fichier

Nous pouvons enregistrer les commandes sed dans un fichier et les appliquer immédiatement dans n'importe quel fichier. Cela peut être fait en spécifiant l'option '-f' comme suit :

 sed -f 

À partir de la commande ci-dessus, le '' est un fichier contenant une liste de commandes sed. Considérez la commande ci-dessous :

 sed -f SedCommands exm.txt 

La commande ci-dessus appliquera toutes les commandes spécifiées dans le fichier « SedCommand » sur « exm.txt ». Considérez le résultat ci-dessous :

Filtre SED Linux

À partir du résultat ci-dessus, nous avons utilisé des commandes appliquées à l’exemple précédent. Le résultat est donc le même que dans l’exemple précédent.

opérateurs javascript

Remplacement de caractères

Nous pouvons utiliser le point d'exclamation (!) comme délimiteur de chaîne. Par exemple, nous voulons remplacer le shell bash et le remplacer par le shell csh dans le '/etc/passwd'. Pour ce faire, exécutez la commande ci-dessous :

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Nous pouvons obtenir le même résultat en exécutant la commande ci-dessous :

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Limiter le sed

L'utilisation de base de la commande sed traite l'intégralité du fichier. Mais nous pouvons limiter la commande sed et spécifier n’importe quelle ligne. Il existe deux manières de limiter la commande sed :

  • Une gamme de lignes.
  • Un motif qui correspond à une ligne spécifique.

Nous pouvons fournir un numéro pour spécifier une ligne comme suit :

 sed '3s/Red/Blue/' exm.txt 

La commande ci-dessus appliquera l'opération spécifiée sur la troisième ligne. Considérez le résultat ci-dessous :

Filtre SED Linux

À partir du résultat ci-dessus, seule la ligne trois est modifiée.

Nous pouvons également spécifier une plage de lignes. Pour spécifier une plage de lignes, exécutez la commande comme suit :

 sed '1,3s/Red/Blue/' exm.txt 

La commande ci-dessus mettra à jour le texte spécifié dans les lignes 1 et 3. Considérez le résultat ci-dessous :

Filtre SED Linux

Insertion et ajout de texte

Les indicateurs « i » et « a » sont utilisés pour insérer et ajouter du texte dans un fichier. Le drapeau « i » ajoutera le texte avant la chaîne et le drapeau « a » est utilisé pour ajouter du texte après la chaîne. Considérez la commande ci-dessous :

 echo 'Another Demo' | sed 'iFirst Demo' 

La commande ci-dessus insérera le texte avant le texte « Another Demo ». Considérez le résultat ci-dessous :

Filtre SED Linux

Pour ajouter du texte, exécutez la commande comme suit :

 echo 'Another Demo' | sed 'aFirst Demo' 

La commande ci-dessus ajoutera le texte. Considérez le résultat ci-dessous :

Filtre SED Linux

Modification des lignes

Le drapeau 'c' est utilisé pour modifier une ligne spécifique. Pour modifier une ligne, exécutez la commande comme suit :

 sed '3cThis is a modified line.' exm.txt 

La commande ci-dessus mettra à jour la ligne trois. Considérez le résultat ci-dessous :

Filtre SED Linux

Nous pouvons également utiliser une expression régulière pour mettre à jour plusieurs lignes ayant le même modèle. Considérez la commande ci-dessous :

 sed '/Apple is /c Line updated.' exm.txt 

La commande ci-dessus mettra à jour toutes les lignes ayant la chaîne « Apple is ». Considérez le résultat ci-dessous :

Filtre SED Linux

Transformation des personnages

Le drapeau 'y' est utilisé pour transformer les caractères. La transformation des personnages ne peut se limiter à des occurrences spécifiques. Pour transformer des caractères, exécutez la commande comme suit :

 sed 'y/abc/def/' exm.txt 

La commande ci-dessus transformera les caractères 'a', 'b', 'c' en 'd', 'e', ​​'f'. considérez le résultat ci-dessous :

Filtre SED Linux

Impression des numéros de ligne

Le signe '=' est utilisé pour imprimer le numéro de ligne. Pour imprimer le numéro de ligne, exécutez la commande comme suit :

 sed '=' exm.txt 

La commande ci-dessus affichera le numéro de ligne du contenu du fichier. Considérez le résultat ci-dessous :

types de référence Java
Filtre SED Linux

Le signe égal avec l'option « -n » spécifie le numéro de ligne qui contient un script correspondant. Considérez le résultat ci-dessous :

 sed -n '/mango/=' exm.txt 

La commande ci-dessus affichera le numéro de ligne contenant le mot « mangue ». Considérez le résultat ci-dessous :

Filtre SED Linux

À partir de la sortie ci-dessus, nous pouvons voir que la ligne numéro 2 contient le mot « mangue ».