Cette réponse est un travail en cours - il manque plus d'exemples sur la commande susbstitute
Qu'est-ce que c'est sed
?
sed
= Stream EDitor
La description dans la page de manuel pour les sed
rapports GNU 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). Bien qu'à certains égards similaire à un éditeur qui autorise les modifications scriptées (comme ed), sed fonctionne en ne faisant qu'un seul passage sur les entrées, et est par conséquent plus efficace. Mais c'est la capacité de sed à filtrer le texte dans un pipeline qui le distingue particulièrement des autres types d'éditeurs.
La description de la page GNU sed
sur gnu.org rapporte:
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 une entrée de texte, effectue une opération (ou un ensemble d'opérations) sur celui-ci et génère le texte modifié. sed est généralement utilisé pour extraire une partie d'un fichier en utilisant la correspondance de modèle ou la substitution de plusieurs occurrences d'une chaîne dans un fichier.
À quoi sed
sert-il?
Il peut être utilisé pour effectuer des modifications complexes de flux de données (généralement du texte, mais il peut également être utilisé pour modifier des données binaires).
Parmi les cas d'utilisation les plus courants, il y a:
- 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 par cette réponse.
Usage
sed
lit l'entrée à partir d'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 depuis 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 en utilisant stdin
:
# herestring
<<<'Hello, World!' sed ''
# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF
# file
<'file' sed ''
# pipe
echo 'Hello, World!' | sed ''
Bonjour le monde!
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 modèle"; enfin, il exécute les commandes répertoriées sur le contenu actuel de l'espace de motif et lit une nouvelle ligne dans le fichier d'entrée.
Lorsqu'aucune commande n'est spécifiée ou lorsqu'une p
ou une d
commande est spécifiée *, sed
imprime toujours le contenu actuel de l'espace de motif suivi d'une nouvelle ligne à chaque itération, indépendamment:
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, celui-ci peut être appelé sed
avec le -n
commutateur:
user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ %
* Ne parlant que pour les commandes p
, d
et s
, qui sont les commandes couvertes dans cette réponse.
Sélection de lignes
sed
peut traiter l'intégralité du fichier d'entrée ou traiter uniquement les lignes sélectionnées du fichier d'entrée; la sélection des lignes du fichier d'entrée à traiter se fait en spécifiant des "adresses"; une adresse peut être (entre autres) soit un numéro de ligne, soit 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): la ou les commandes suivantes seront exécutées uniquement sur le numéro de ligne <N>
;
<N>,<M>
(où <N>
et <M>
sont deux nombres, <N>
> <M>
): la ou les commandes suivantes seront exécutées sur des lignes allant du numéro <N>
de ligne au numéro de ligne <M>
inclus;
/<pattern>/
(où <pattern>
est une expression régulière de base 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 simples ou étendus expressions régulières): la commande suivante / commandes sont effectué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 dans le cas de multiple ordonné <pattern1>
- <pattern2>
occurences;
<N>,/pattern/
(où <N>
est un nombre et <pattern>
est une expression régulière de base 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 de base ou étendue et <N>
est un nombre): la ou les commandes suivantes seront exécutées sur des 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; en outre, la sélection effectuée pour imprimer, supprimer ou effectuer des substitutions sur des plages de lignes à l'aide de motifs est paresseuse et globale (c'est-à-dire que chaque plage affectée sera toujours la plus petite possible et que plusieurs plages seront affectées).
Lorsque vous imprimez des plages de lignes ou imprimez uniquement des lignes sur lesquelles une substitution a été effectuée, il est nécessaire d'appeler sed
avec le -n
commutateur afin d'éviter que les lignes correspondant au critère soient imprimées deux fois (cela ne se produit que lors de l'impression de plages de lignes) et dans l'ordre pour éviter que les lignes ne correspondant pas au critère soient 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 groupées à l'aide d'accolades.
Commandes: imprimer, supprimer
Les commandes utilisées pour imprimer ou supprimer une sélection sont respectivement:
p
: imprime des lignes correspondant à l'adresse / plage d'adresses spécifiée;
d
: supprime les lignes correspondant à l'adresse / plage d'adresses spécifiée;
Lorsqu'une de ces commandes n'est pas 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.
Exemples: imprimer, supprimer
Impression / suppression de lignes spécifiant des adresses numériques:
Exemple de fichier:
line1
line2
line3
line4
line5
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
- Suppression d'une 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>
pour <M>
inclure:
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
- Correspondance des lignes d'impression
<pattern>
:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
- Suppression des lignes correspondantes
<pattern>
:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file
First line
Random line
Random line
Random line
Last line
- Impression de lignes de la correspondance de ligne
<pattern1>
à la correspondance de ligne <pattern2>
incluse:
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 correspondance de ligne
<pattern1>
à la correspondance de ligne <pattern2>
incluse:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file
First line
Last line
Commande: substitut
La commande utilisée pour effectuer une substitution sur une sélection est:
s
: remplace les lignes correspondant à l'adresse / plage d'adresses spécifiée;
Lorsque cette commande n'est pas 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 s
commande est:
s/<pattern>/<replacement_string>/<pattern_flags>
Les barres obliques sont des "délimiteurs"; ils sont utilisés pour délimiter la <pattern>
, <replacement_string>
et des <pattern_flags>
sections;
Le délimiteur est toujours le caractère suivant immédiatement la s
commande; 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 de base ou étendue; <replacement_string>
est une chaîne fixe qui peut inclure des sed
séquences spécifiques avec une signification spéciale; <pattern_flags>
est une liste de drapeaux qui modifient le comportement de <pattern>
.
sed
Séquences spécifiques les plus courantes avec une signification particulière:
&
: référence arrière remplacée par la chaîne correspondant à <pattern>
;
\<N>
(où <N>
est un nombre): référence arrière remplacée par le <N>
groupe capturé dans <pattern>
;
Drapeaux les plus courants:
g
: force <pattern>
à correspondre globalement, c'est-à-dire plusieurs fois dans chaque ligne;
i
: force <pattern>
à faire correspondre la casse de manière insensible;
p
: imprime à nouveau les lignes sur lesquelles une substitution a été effectuée (utile lorsque vous utilisez l 'invocation du -n
commutateur dans sed
pour 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...
- Remplacement de la première occurrence de
<pattern>
avec <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
- Remplacement de toutes les occurrences de
<pattern>
avec <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électionner uniquement les lignes commençant par
<pattern1>
et remplaçant toutes les occurrences de <pattern2>
avec <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électionner uniquement les lignes se terminant par
<pattern1>
et remplacer toutes les occurrences de <pattern2>
avec <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 is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.