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.
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.
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,
dmesg | head -n 3
(en imprimant les 3 premières lignes), on peut faire dmesg | sed -n 1,3p
.dmesg | grep 'wlan0'
(recherche d’une chaîne), on peut faire dmesg | sed -n '/wlan0/p'
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
Cette réponse est un travail en cours - il manque plus d'exemples sur la commande subsbstitute
sed
name__?sed
= Editeur de flux
La description dans la page de manuel de GNU sed
4.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 sed
at 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.
sed
name__?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:
Ce sont les cas d'utilisation couverts dans cette réponse.
sed
lit 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 stdin
si 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 stdin
name__:
# herestring
<<<'Hello, World!' sed ''
# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF
# file
<'file' sed ''
# pipe
echo 'Hello, World!' | sed ''
sed
lit 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 p
ou un d
est spécifié *, sed
imprimera 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 sed
avec 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 p
name__, d
et s
name__, qui sont les commandes traitées dans cette réponse.
sed
peut 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 sed
avec 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.
Les commandes utilisées pour imprimer ou supprimer une sélection sont, respectivement:
p
name__: affiche les lignes correspondant à l’adresse/plage d’adresses spécifiée;d
name__: 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.
Exemple de fichier:
line1
line2
line3
line4
line5
<N>
:sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
<N>
:sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
<N>
à <M>
inclus:sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
<N>
à <M>
inclus:sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5
Exemple de fichier:
First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
<pattern>
:sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
<pattern>
:sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file
First line
Random line
Random line
Random line
Last line
<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
<pattern1>
à la ligne correspondant à <pattern2>
inclus:sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file
First line
Last line
La commande utilisée pour effectuer une substitution sur une sélection est:
s
name__: 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 s
est 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 s
name__; 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 à sed
name __ avec une signification spéciale; <pattern_flags>
est une liste de drapeaux qui modifient le comportement de <pattern>
.
sed
name 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:
g
name__: force <pattern>
à correspondre globalement, c’est-à-dire plusieurs fois dans chaque ligne;i
name__: force <pattern>
à correspondre à la casse;p
name__: imprime les lignes sur lesquelles une substitution a été effectuée (utile lors de l’utilisation du commutateur -n
dans l’appel de sed
pour imprimer uniquement les lignes sur lesquelles une substitution a été effectuée);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...
<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
<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...
<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
<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
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/