web-dev-qa-db-fra.com

Qu'est-ce que sed et à quoi sert-il?

J'ai vu beaucoup de sed récemment, et je trouve que c'est une commande plutôt déroutante. Les pages de manuel n'étaient pas particulièrement utiles, mais je sais qu'il peut être utilisé pour analyser la sortie d'autres commandes.

Qu'est-ce que c'est exactement sed et quelles sont ses utilisations? Je cherche une réponse complète couvrant ce qu'est sed, à quoi il sert couramment, et quelques exemples/syntaxes de base.

18
Seth

En utilisation de base, il est utilisé pour "rechercher et remplacer" avec des chaînes.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

résultats

"The quick brown fox jumps over the lazy cat"

Sed brille vraiment lorsque des expressions régulières sont utilisées avec.

Vous voudrez peut-être jeter un œil à cet article à propos de sed, il est assez complet.

18
demure

Définitions

Unix System V: un guide pratique , livre de Mark Sobell:

L'utilitaire sed est un éditeur de lot (non interactif). Les commandes sed sont généralement stockées dans un fichier script. . Bien que vous puissiez donner des commandes sed simples à partir de la ligne de commande. . .

Page de manuel de sed (GNU sed) 4.2.2:

Sed est un éditeur de flux. Un éditeur de flux est utilisé pour effectuer des transformations de texte de base sur un flux d'entrée (un fichier ou une entrée à partir d'un pipeline).

Ma définition informelle:

Sed (abréviation de éditeur de flux ) est un utilitaire de traitement de texte qui a été développé au moment où le texte était traité ligne par ligne, mais qui reste l’un des plus puissants systèmes Unix./Utilitaires Linux; dans le même temps, il s’agit d’une forme de langage de script spécialement conçue pour le traitement de texte.

Utilisations

Comme le suggèrent les définitions, sed est utilisé pour le traitement par lots de lignes de texte, de fichiers texte et de flux de texte acheminés. Le plus souvent, il est utilisé pour remplacer et supprimer du texte:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Cependant, il peut également être utilisé pour imiter le comportement d’autres commandes. Par exemple,

  • pour imiter dmesg | head -n 3 (en imprimant les 3 premières lignes), on peut faire dmesg | sed -n 1,3p.
  • pour imiter dmesg | grep 'wlan0' (recherche d’une chaîne), on peut faire dmesg | sed -n '/wlan0/p'
  • Élément de liste

Le gros avantage que sed a par rapport aux autres utilitaires de traitement de texte est l'indicateur -i, ce qui signifie que nous ne pouvons pas simplement afficher le texte modifié à l'écran, mais en réalité enregistrer la modification dans le fichier d'origine. Les noms awk, en revanche, ne possèdent cette fonctionnalité que dans la version GNU awk.

sed peut prendre des entrées sur la ligne de commande, avec plusieurs modèles séparés par un point-virgule (;) ou à partir d'un fichier de script spécifié après l'indicateur -f, par exemple. cat someTextfile.txt | sed -f myScript.sed

Applications Sed et exemples

4

Cette réponse est un travail en cours - il manque plus d'exemples sur la commande subsbstitute


Qu'est-ce que sedname__?

sed= Editeur de flux

La description dans la page de manuel de GNU sed4.2.2 indique:

Sed est un éditeur de flux. Un éditeur de flux est utilisé pour effectuer des transformations de texte de base sur un flux d’entrée (un fichier ou une entrée à partir d’un pipeline). Bien que, à certains égards, similaire à un éditeur autorisant les éditions de script (telles que ed), sed fonctionne en ne faisant qu'un seul passage sur les entrées et est donc plus efficace. Mais c’est la capacité de sed de filtrer du texte dans un pipeline qui le distingue particulièrement des autres types d’éditeurs.

La description dans la page GNU sedat gnu.org indique:

sed (éditeur de flux) n'est pas un éditeur de texte interactif. Au lieu de cela, il est utilisé pour filtrer le texte, c’est-à-dire qu’il prend en entrée du texte, qu’il effectue une opération (ou un ensemble d’opérations) dessus et qu’il affiche le texte modifié. sed est généralement utilisé pour extraire une partie d'un fichier à l'aide d'une correspondance de modèle ou en substituant plusieurs occurrences d'une chaîne dans un fichier.

À quoi sert sedname__?

Il peut être utilisé pour effectuer des modifications complexes sur des flux de données (généralement du texte, mais également pour modifier des données binaires).

Parmi les cas d'utilisation les plus courants, citons:

  • Impression/suppression sélective de lignes d'un fichier texte à l'aide d'expressions régulières de base/étendues
  • Remplacement global de chaînes dans un fichier texte à l'aide d'expressions régulières de base/étendues
  • Remplacement sélectif de chaînes dans un fichier texte à l'aide d'expressions régulières de base/étendues

Ce sont les cas d'utilisation couverts dans cette réponse.

Usage

sedlit l'entrée dans un fichier stocké dans le système de fichiers si un nom de fichier est spécifié dans les arguments de la ligne de commande lors de son appel ou à partir de stdinsi aucun nom de fichier n'est spécifié.

Invocation minimale à l'aide d'un fichier stocké dans le système de fichiers:

sed '' file

Invocation minimale à l'aide de stdinname__:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Bonjour le monde!

sedlit par défaut le fichier d'entrée ligne par ligne; il lit une ligne, il supprime la nouvelle ligne de fin de la ligne et place la ligne traitée dans un "espace de modèle"; enfin, il exécute les commandes répertoriées sur le contenu actuel de l'espace de modèle et lit une nouvelle ligne à partir du fichier d'entrée.

Quand aucune commande n'est spécifiée ou lorsqu'un pou un dest spécifié *, sedimprimera toujours le contenu actuel de l'espace de modèle suivi d'une nouvelle ligne à chaque itération, quelle que soit:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Pour éviter cela, vous pouvez appeler sedavec le commutateur -n:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Parlant uniquement pour les commandes pname__, det sname__, qui sont les commandes traitées dans cette réponse.

Sélection de lignes

sedpeut traiter l’ensemble du fichier d’entrée ou ne traiter que les lignes sélectionnées du fichier d’entrée; la sélection des lignes du fichier d'entrée à traiter est effectuée en spécifiant "adresses"; une adresse peut être (entre autres) un numéro de ligne ou un motif; des plages de lignes peuvent être sélectionnées en spécifiant des plages d'adresses.

Les combinaisons possibles d’adresses sont:

  • <N> (où <N> est un nombre): les commandes suivantes seront exécutées uniquement sur le numéro de ligne <N>;
  • <N>,<M> (où <N> et <M> sont deux chiffres, <N>> <M>): les commandes/commandes suivantes seront exécutées sur des lignes allant du numéro de ligne <N> au numéro de ligne <M> inclus;
  • /<pattern>/ (où <pattern> est une expression régulière simple ou étendue): la ou les commandes suivantes seront exécutées uniquement sur les lignes contenant une occurrence de <pattern>;
  • /<pattern1>/,/<pattern2>/ (où <pattern1> et <pattern2> sont des expressions régulières simples ou étendues): les commandes suivantes seront exécutées sur des lignes allant de la première ligne contenant une occurrence de <pattern1> à la ligne suivante contenant une occurrence de <pattern2>, plusieurs fois en cas de plusieurs ordonné <pattern1>-<pattern2> occurrences;
  • <N>,/pattern/ (où <N> est un nombre et <pattern> est une expression régulière simple ou étendue): la ou les commandes suivantes seront exécutées sur des lignes allant du numéro de ligne <N> à la première ligne contenant une occurrence de <pattern>;
  • /pattern/,<N> (où <pattern> est une expression régulière simple ou étendue et <N> est un nombre): la ou les commandes suivantes seront exécutées sur les lignes allant de la première ligne contenant une occurrence de <pattern> au numéro de ligne <N>;

La sélection effectuée pour imprimer, supprimer ou effectuer des substitutions sur des plages de lignes inclura toujours les lignes correspondant aux adresses spécifiées; de plus, la sélection effectuée pour imprimer, supprimer ou effectuer des substitutions sur des plages de lignes à l'aide de motifs est paresseuse et global (chaque plage affectée sera toujours la plus petite possible et plusieurs plages seront affectées).

Lorsque vous imprimez des plages de lignes ou uniquement des lignes sur lesquelles une substitution a été effectuée, il est nécessaire d'appeler sedavec le commutateur -n afin d'empêcher les lignes correspondant au critère d'être imprimées deux fois (ceci se produit uniquement lors de l'impression de plages de lignes) et afin d'éviter que les lignes ne correspondant pas au critère ne soient pas imprimées.

Une sélection de lignes à traiter doit être suivie d'une commande ou de plusieurs commandes séparées par des points-virgules et regroupées à l'aide d'accolades.

Commandes: imprimer, supprimer

Les commandes utilisées pour imprimer ou supprimer une sélection sont, respectivement:

  • pname__: affiche les lignes correspondant à l’adresse/plage d’adresses spécifiée;
  • dname__: supprime les lignes correspondant à l'adresse/à la plage d'adresses spécifiée;

Lorsque l’une de ces commandes est et non précédée d’une adresse/sélection, elle est exécutée globalement, c’est-à-dire sur chaque ligne du fichier d’entrée.

Exemples: imprimer, supprimer

Impression/suppression de lignes spécifiant des adresses numériques:

Exemple de fichier:

line1
line2
line3
line4
line5
  • Ligne d'impression <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Suppression de la ligne <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Ligne d'impression <N> à <M> inclus:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Suppression de la ligne <N> à <M> inclus:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Impression/suppression de lignes spécifiant des motifs:

Exemple de fichier:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Lignes d'impression correspondant à <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Suppression de lignes correspondant à <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Impression des lignes de la ligne correspondant à <pattern1> à la ligne correspondant à <pattern2> inclus:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Suppression de lignes de la ligne correspondant à <pattern1> à la ligne correspondant à <pattern2> inclus:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Commande: substitue

La commande utilisée pour effectuer une substitution sur une sélection est:

  • sname__: substitue les lignes correspondant à l’adresse/plage d’adresses spécifiée;

Lorsque cette commande est et non précédée d’une adresse/sélection, la commande est exécutée globalement, c’est-à-dire sur chaque ligne du fichier d’entrée.

La syntaxe de la commande sest la suivante:

s/<pattern>/<replacement_string>/<pattern_flags>

Les barres obliques sont des "délimiteurs"; ils servent à délimiter les sections <pattern>, <replacement_string> et <pattern_flags>;

Le délimiteur est toujours le caractère qui suit immédiatement la commande sname__; il peut être défini sur n'importe quel autre caractère, par exemple, |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern> est une expression régulière simple ou étendue; <replacement_string> est une chaîne fixe pouvant inclure des séquences spécifiques à sedname __ avec une signification spéciale; <pattern_flags> est une liste de drapeaux qui modifient le comportement de <pattern>.

sedname les plus courantes __- séquences spécifiques avec une signification particulière:

  • &: backreference remplacé par la chaîne correspondant à <pattern>;
  • \<N> (où <N> est un nombre): référence arrière remplacée par le groupe <N> saisi dans <pattern>;

Drapeaux les plus communs:

  • gname__: force <pattern> à correspondre globalement, c’est-à-dire plusieurs fois dans chaque ligne;
  • iname__: force <pattern> à correspondre à la casse;
  • pname__: imprime les lignes sur lesquelles une substitution a été effectuée (utile lors de l’utilisation du commutateur -n dans l’appel de sedpour imprimer uniquement les lignes sur lesquelles une substitution a été effectuée);

Exemples: substitut

Exemple de fichier:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, the bird is the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, b-bird's the Word
A-well-a bird, bird, bird, b-bird's the Word
A-well-a bird, bird, bird, well the bird is the Word
A-well-a bird, bird, b-bird's the Word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the Word!
A-well-a bird, bird, b-bird's the Word
A-well-a...
  • Remplacer la première occurrence de <pattern> par <replacement_string> sur chaque ligne:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, the bird is the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, b-bird's the Word
A-well-a birds, bird, bird, b-bird's the Word
A-well-a birds, bird, bird, well the bird is the Word
A-well-a birds, bird, b-bird's the Word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the Word!
A-well-a birds, bird, b-bird's the Word
  • Remplacer toutes les occurrences de <pattern> par <replacement_string> sur chaque ligne:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the Word!
A-well-a birds, birds, b-birds's the Word
A-well-a...
  • Sélection uniquement des lignes commençant par <pattern1> et remplacement de toutes les occurrences de <pattern2> par <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the Word
  • Sélection uniquement des lignes se terminant par <pattern1> et remplacement de toutes les occurrences de <pattern2> par <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/Word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, the birds is the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, birds, b-birds's the Word
A-well-a birds, birds, birds, well the birds is the Word
A-well-a birds, birds, b-birds's the Word
A-well-a birds, birds, b-birds's the Word
1
kos

sed est une commande puissante qui vous permet de créer des éléments (supprimer des lignes, remplacer des chaînes, filtrer des chaînes, etc.).

Je pourrais vous donner une liste d'utilisations avec args mais internet en est rempli. La recherche sed usage by examples m'apporte beaucoup de résultats, le mignon: http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/

1
ssoto