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

20

J'en ai vu beaucoup sedces derniers temps, et je trouve que c'est une commande assez déroutante. Les pages de manuel n'étaient pas particulièrement utiles, mais je sais qu'elles peuvent être utilisées pour analyser la sortie d'autres commandes.

Qu'est-ce que c'est exactement sedet quelles sont ses utilisations? Je suis à la recherche d'une réponse complète couvrant ce qui sedest, à quoi il sert couramment et quelques exemples de base / syntaxe.

Seth
la source
3
Depuis la page de manuel Sed: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.
saji89
Cela devrait être un bon endroit pour commencer une réponse complète: en.wikipedia.org/wiki/Sed
saji89
1
info seda beaucoup plus que man sed. Puis, /usr/share/doc/seddedans, il y a sedfaq.txt.gz.

Réponses:

20

Dans l'utilisation de base, il est utilisé pour «rechercher et remplacer» par des chaînes.

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

Retour

"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 sur sed, son assez complet.

sage
la source
5

Définitions

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

L'utilitaire sed est un éditeur par lots (non interactif). Les commandes sed sont généralement stockées dans un fichier script. . .même si vous pouvez donner des commandes sed simples à partir de la ligne de commande. . .

Page de manuel pour 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 stream editor ) 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 utilitaires Unix / Linux les plus puissants; en même temps, c'est une forme de langage de script, spécialement conçu pour le traitement de texte.

Les usages

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

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

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

  • imiter dmesg | head -n 3(imprimer les 3 premières lignes), nous pouvons le faire dmesg | sed -n 1,3p.
  • imiter dmesg | grep 'wlan0'(chercher une chaîne), on peut fairedmesg | sed -n '/wlan0/p'
  • Élément de liste

Le grand avantage qui seda sur les autres utilitaires de traitement de texte est le -idrapeau, ce qui signifie que nous ne pouvons pas simplement afficher le texte modifié à l'écran, mais enregistrer réellement la modification dans le fichier d'origine. awkles saveurs, en revanche, n'ont qu'une telle fonctionnalité dans la GNU awkversion.

sedpeut 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' -findicateur, par exemplecat someTextfile.txt | sed -f myScript.sed

Applications et exemples Sed

Sergiy Kolodyazhnyy
la source
1

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 sedrapports 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 sedsur 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 sedsert-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

sedlit 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 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 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!

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 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 pou une dcommande est spécifiée *, sedimprime 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é sedavec le -ncommutateur:

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, det s, qui sont les commandes couvertes dans cette réponse.

Sélection de lignes

sedpeut 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 sedavec le -ncommutateur 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
  • Ligne d'impression <N>:
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 scommande 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 scommande; 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 sedséquences spécifiques avec une signification spéciale; <pattern_flags>est une liste de drapeaux qui modifient le comportement de <pattern>.

sedSé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 -ncommutateur dans 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...
  • 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
kos
la source