Introduction

Introduction

Bienvenue dans la deuxième partie de notre série, une partie qui se concentrera sur SED, la version GNU. Comme vous le verrez, il existe plusieurs variantes de SED, qui est disponible pour plusieurs plateformes, mais nous nous concentrerons sur les versions GNU SED 4.X. Beaucoup d'entre vous ont déjà entendu parler de SED et l'ont déjà utilisé, principalement comme outil de substitution. Mais ce n'est qu'un segment de ce que SED peut faire, et nous ferons de notre mieux pour vous montrer autant que possible ce que vous pouvez faire avec. Le nom signifie Stream Editor, et ici «Stream» peut être un fichier, un tuyau ou simplement STDIN. Nous nous attendons à ce que vous ayez des connaissances Linux de base et si vous avez déjà travaillé avec des expressions régulières ou du moins savez ce qu'est un regexp, mieux c'est. Nous n'avons pas l'espace pour un tutoriel complet sur les expressions régulières, donc nous ne vous donnerons qu'une idée de base et de nombreux exemples SED. Il y a beaucoup de documents qui traitent du sujet, et nous aurons même quelques recommandations, comme vous le verrez dans une minute.

Installation

Il n'y a pas grand-chose à dire ici, car il y a de fortes chances que vous ayez déjà installé SED, car il est utilisé dans divers scripts système et un outil inestimable dans la vie d'un utilisateur Linux qui veut être efficace. Vous pouvez tester la version que vous avez en tapant

 $ sed --version

Sur mon système, cette commande me dit que j'ai gnu sed 4.2.1 installé, plus des liens vers la page d'accueil et d'autres choses utiles. Le package est nommé simplement «SED» quelle que soit la distribution, mais si Gentoo offre SED implicitement, je crois que cela signifie que vous pouvez être assuré.

Concepts

Avant d'aller plus loin, nous pensons qu'il est important de signaler quoi est-ce exactement que SED le fait, car «l'éditeur de flux» peut ne pas sonner trop de cloches. SED prend le texte d'entrée, fait les opérations spécifiées sur chaque ligne (sauf indication contraire) et imprime le texte modifié. Les opérations spécifiées peuvent être ajoutées, insérer, supprimer ou substituer. Ce n'est pas aussi simple que possible: être prévenu qu'il y a beaucoup d'options et de combinaisons qui peuvent rendre une commande SED plutôt difficile à digérer. Donc, si vous voulez utiliser SED, nous vous recommandons d'apprendre les bases des regexps, et vous pouvez attraper le reste au fur et à mesure. Avant de commencer le tutoriel, nous tenons à remercier Eric Pement et d'autres pour l'inspiration et pour ce qu'il a fait pour tous ceux qui veulent apprendre et utiliser SED.



Expressions régulières

Comme les commandes / scripts SED ont tendance à devenir cryptiques, nous pensons que nos lecteurs doivent comprendre les concepts de base au lieu de copier aveuglément et coller des commandes qu'ils ne connaissent pas la signification de. Quand on veut comprendre ce qu'est un regexp, le mot clé est «correspondant». Ou encore mieux, «correspondance de motifs». Par exemple, dans un rapport pour votre service RH, vous avez écrit le nom de Nick lorsque vous faites référence à l'architecte réseau. Mais Nick a continué et John est venu prendre sa place, alors maintenant vous devez remplacer le mot Nick par John. Si le fichier est appelé rapport.txt, tu pourrais faire

 $ RAPPORT DE CAT.txt | sed 'S / Nick / John / g'> report_new.SMS

Par défaut SED utilise STDOUT, vous pouvez donc utiliser l'opérateur de redirection de votre coquille, comme dans notre exemple ci-dessous. Ceci est un exemple très simple, mais nous avons illustré quelques points: nous correspondons au modèle «Nick» et nous substituons toutes les instances par «John». Notez que SED est sensible à la casse, alors soyez prudent et vérifiez votre fichier de sortie pour voir si toutes les substitutions ont été effectuées. Ce qui précède aurait pu être écrit aussi comme ceci:

 Rapport de $ SED 'S / NICK / JOHN / G'.txt> report_new.SMS

OK, mais où sont les expressions régulières, vous demandez? Eh bien, nous voulions d'abord vous mouiller les pieds avec le concept de correspondance et voici la partie intéressante.

Si vous ne savez pas si vous avez écrit «Nick» par erreur au lieu de «Nick» et que vous voulez également faire correspondre cela, vous pouvez utiliser SED 'S / Nick | Nick / John / G'. La barre verticale a la même signification que vous savez peut-être si vous avez utilisé C, c'est-à-dire que votre expression correspondra à Nick ou pseudo. Comme vous le verrez, le tuyau peut également être utilisé d'autres manières, mais sa «signification restera. Les autres opérateurs largement utilisés dans les regexps sont '?', qui correspondent à zéro ou à une instance de l'élément précédent (flavou?r correspondra à la saveur et à la saveur), '*' signifie zéro ou plus et '+' correspond à un ou plusieurs éléments. '^' correspond au début de la chaîne, tandis que '$' fait le contraire. Si vous êtes un utilisateur vi (m), certaines de ces choses pourraient sembler familières. Après tout, ces services publics, avec AWK ou C, ont leurs racines dans les premiers jours d'Unix. Nous n'insisterons plus sur le sujet, car les choses deviendront plus simples en lisant des exemples, mais ce que vous devez savoir, c'est qu'il existe diverses implémentations de regexps: POSIX, POSIX étendu, perl ou diverses implémentations d'expressions régulières floues, garantie à donner vous un mal de tête.



Exemples SED

Apprendre la commande Linux SED avec des exemples
Syntaxe de commande Linux Description de la commande Linux
Rapport SED S / Nick / John / G '.SMS
Remplacer chaque occurrence de Nick par John dans le rapport.SMS
SED 'S / NICK | Nick / John / G' Rapport.SMS
Remplacez chaque occurrence de Nick ou Nick par John.
Fichier SED 'S / ^ / /'.txt> file_new.SMS
Ajoutez 8 espaces à gauche d'un texte pour une jolie impression.
sed -n '/ bien sûr /, / attention vous \
PAY / P 'MYFILE

Affichez un seul paragraphe, en commençant par «bien sûr»

Et se terminant par «l'attention que vous payez»

Fichier SED -N 12,18p.SMS
Afficher uniquement les lignes 12-18 du fichier.SMS
Fichier SED 12,18D.SMS
Afficher tout le fichier.txt à l'exception des lignes de 12 à 18
Fichier SED G.SMS 
Fichier à double espace.SMS
script sed -f.fichier SED.SMS
Écrivez toutes les commandes dans le script.sed et les exécuter
Sed '5!S / Ham / Cheese / 'Fichier.SMS
Remplacez le jambon par du fromage dans le dossier.txt sauf dans la 5e ligne
fichier sed '$ d'.SMS
Supprimer la dernière ligne
SED '/ [0-9] \ 3 \ / p' fichier.SMS
Imprimez uniquement les lignes avec trois chiffres consécutifs
sed '/ boom /!fichier s / aaa / bb / '.SMS
À moins que le boom ne soit trouvé, remplacez AAA par BB
Fichier SED '17, / disque / d '.SMS
Supprimez toutes les lignes de la ligne 17 à «disque»
écho un deux | sed "s / one / unos / i"

En remplace un par unos de manière insensible au cas,

Il imprimera donc "Unos deux"

fichier sed 'g; g'.SMS
Triple espace un fichier
sed 'S /.Fichier $ // '.SMS
Un moyen de remplacer Dos2Unix 🙂
SED 'S / ^ [^ T] * //' Fichier.SMS
Supprimer tous les espaces devant chaque ligne de fichier.SMS
SED 'S / [^ T] * $ //' Fichier.SMS
Supprimer tous les espaces à la fin de chaque ligne de fichier.SMS
sed 'S / ^ [^ t] * //; s / [^] * $ //' fichier.SMS

Supprimer tous les espaces devant et à la fin de chaque ligne

de fichier.SMS

Fichier SED 'S / FOO / BAR /'.SMS
Remplacez Foo par Bar uniquement pour la première instance dans une ligne.
Fichier SED S / FOO / BAR / 4 '.SMS
Remplacez Foo par Bar uniquement pour la 4e instance dans une ligne.
Fichier SED S / FOO / BAR / G '.SMS 
Remplacez Foo par Bar pour toutes les instances dans une ligne.
SED '/ BAZ / S / FOO / BAR / G' Fichier.SMS
Seulement si la ligne contient baz, remplacez Foo par barre
sed '/./, / ^ $ /!D 'fichier.SMS
Supprimer toutes les lignes vides consécutives à l'exception de l'EOF
Sed '/ ^ $ / n; / \ n $ / d' fichier.SMS

Supprimer toutes les lignes vierges consécutives, mais permet

Seule la ligne vide supérieure

sed '/./, $!D 'fichier.SMS
Supprimer toutes les lignes vierges principales
sed -e: a -e '/ ^ \ n * $ / $ d; n;; / \ n $ / ba' \
déposer.SMS
Supprimer toutes les lignes vides traînantes
sed -e: a -e '/ \\ $ / n; S / \\\ n //; ta '\
déposer.SMS

Si un fichier se termine par une barre oblique inverse, rejoignez-le avec le suivant (utile

pour les scripts de coquille)

sed '/ regex /, + 5 / expr /'
Match Regex plus les 5 prochaines lignes
Fichier SED '1 ~ 3D'.SMS
Supprimer chaque troisième ligne, en commençant par le premier
fichier sed -n '2 ~ 5p'.SMS
Imprimez toutes les 5e ligne à partir de la seconde
Rapport SED 'S / [NN] ICK / JOHN / G'.SMS

Une autre façon d'écrire un exemple ci-dessus.

Pouvez-vous deviner lequel?

SED -N '/ RE / P; Q;' Fichier.SMS

Imprimer uniquement le premier match de

Re (expression régulière)

SED '0, / re / // d;' fichier.SMS
Supprimer uniquement le premier match
SED '0, / re / s // TO_THAT /' Fichier.SMS
Changer uniquement le premier match
sed 'S / ^ [^,] *, / 9999, /' fichier.CSV
Changer le premier champ à 9999 dans un fichier CSV
S / ^ * \ (.* [^] \) * $ / | \ 1 | /;
S / "*, * /" | / g;
: boucle
S / | * \ ([^ ", |] [^, |] * \) *, * / | \ 1 | / g;
S / | *, * / | \ 1 | / g;
boucle t
s / * | / | / g;
S / | * / | / g;
S / ^ | \ (.* \) | $ / \ 1 /;

Script SED pour convertir le fichier CSV en bar séparé

(ne fonctionne que sur certains types de CSV,

avec des «S et des virgules intégrées)

sed ': a; s / \ (^ \ | [^ 0-9.] \) \ ([0-9] \ + \) \\
([0-9] \ 3 \ \) / \ 1 \ 2, \ 3 / g;.SMS
Modifier les nombres à partir du fichier.txt de 1234.56 Formulaire à 1.234.56
sed -r "s / \<(reg|exp)[a-z]+/\U&/g"
Convertir n'importe quel mot commençant par reg ou exp en majuscule
Fichier SED '1,20 S / Johnson / White / G'.SMS

Remplacement de Johnson par blanc uniquement sur

lignes entre 1 et 20

SED '1,20 !S / Johnson / White / G 'Fichier.SMS
L'inversé ci-dessus (correspond à toutes sauf les lignes 1-20)
sed '/ from /, / jusqu'à / s / \ / magenta / g; \
s / \ / cyan / g; ' déposer.SMS
Remplacer uniquement entre «de» et «jusqu'à»
sed '/ endnotes: /, $ s / schaff / herzog / g; \
S / Kraft / Ebbing / G; ' déposer.SMS
Remplacer uniquement du mot «notes de fin:» jusqu'à EOF
sed '/./ H; $!d;; x; / regex /!D 'fichier.SMS
Imprimer les paragraphes uniquement s'ils contiennent des experts
 sed -e '/./ H; $!d; '-e' x; / re1 /!d;\
/ Re2 /!d; / re3 /!D 'fichier.SMS

Imprimer les paragraphes uniquement s'ils contiennent RE1,

RE2 et RE3

 sed ': a; / \\ $ / n; S / \\\ n //; Ta 'fichier.SMS

Rejoignez deux lignes dans les premières extrémités dans une barre arrière

 SED 'S / 14 "/ quatorze pouces / g' fichier.SMS

C'est ainsi que vous pouvez utiliser Double Quotes

 sed 'S / \ / Some \ / unix \ / path / \ / a \ / new \\
/ Fichier Path / G '.SMS

Travailler avec Unix Paths

 SED 'S / [A-G] // G' Fichier.SMS

Supprimer tous les caractères de A à G du fichier.SMS

sed 'S / \ (.* \) fichier foo / \ 1bar / '.SMS
Remplacer uniquement le dernier match de FOO par Bar
Sed '1!G; h; $!d' 
Un remplacement TAC
sed '/ \ n /!G; s / \ (.\) \ (.* \ n \) / & \ 2 \ 1 \
/; // d; s /.// '
Un remplacement du révérend
Fichier SED 10Q.SMS
Un remplacement de la tête
sed -e: a -e '$ q; n; 11, $ d; ba' \
déposer.SMS
Un remplacement de queue
sed '$!N; / ^ \ (.* \) \ n \ 1 $ /!P; D' \
déposer.SMS
Un remplacement UNIQ
sed '$!N; S / ^ \ (.* \) \ n \ 1 $ / \ 1 /; \
T; D 'fichier.SMS
L'équivalent opposé (ou Uniq -D)
sed '$!N; $!D 'fichier.SMS
Équivalent à la queue -N 2
fichier sed -n '$ p'.SMS
… Tail -N 1 (ou queue -1)
sed '/ regexp /!D 'fichier.SMS
Grep équivalent
sed -n '/ regexp / g; 1!p;; h 'fichier.SMS

Imprimez la ligne avant celle qui correspond à Regexp, mais

pas celui contenant le regexp

Sed -n '/ regexp / n; p;' fichier.SMS
Imprimez la ligne après celle qui correspond au regexp, mais

pas celui contenant le regexp

Fichier SED '/ Pattern / D'.SMS
Supprimer le modèle de correspondance des lignes
sed '/./ /!D 'fichier.SMS
Supprimer toutes les lignes vides d'un fichier
sed '/ ^ $ / n; / \ n $ / n; // d' fichier.SMS

Supprimer toutes les lignes vides consécutives

Sauf pour les deux premiers

sed -n '/ ^ $ / p; h;; /./X;/./ p; '\
déposer.SMS
Supprimer la dernière ligne de chaque paragraphe
sed 'S /.Fichier \ x08 // g '
Supprimer les overs-mèches de Nroff
sed '/ ^ $ / q'
Obtenez une en-tête de courrier
sed '1, / ^ $ / d'
Obtenez un corps de courrier
SED '/ ^ Sujet: * /!d; S ///; Q '
Obtenir le sujet du courrier
sed 'S / ^ /> /'

Citer le message du courrier en insérant un

">" Devant chaque ligne

sed 'S / ^> //'
Le contraire (message du courrier unquote)
sed -e: a -e 's /] *> // g; / 
Supprimer les balises HTML
sed '/./ H; d;; x; s / \ n / = nl = / g '\
déposer.txt | trier \
| sed '1s / = nl = //; s / = nl = / \ n / g'
Trier les paragraphes de fichiers.txt alphabétiquement
SED 'S @ / USR / BIN @ & / LOCAL @ G' Path.SMS
Remplacer / usr / bin par / usr / bin / local dans le chemin du chemin.SMS
sed 'S @ ^.* $ @<<>> @g 'chemin.SMS
Essayez-le et voyez 🙂
sed 'S / \ (\ / [^:] * \).* / \ 1 / g 'chemin.SMS

Path fourni.txt contient $ path, ce sera

écho uniquement le premier chemin sur chaque ligne

sed 'S / \ ([^:] * \).* / \ 1 / '/ etc / passwd

Awk remplacement - Affiche uniquement les utilisateurs

à partir du fichier passwd

Echo "Bienvenue sur les trucs de geek" | sed \
's / \ (\ b [a-z] \) / \ (\ 1 \) / g'
(W) elcome (t) o (t) he (g) eek (s) tuf
Explicite
sed -e '/ ^ $ /, / ^ end / s / collines / \
Fichier de montagnes / g '.SMS

Échangez les «collines» pour les «montagnes», mais uniquement sur les blocs

du texte débutant

avec une ligne vide et se terminant par une ligne commençant

avec la «fin», inclusive

sed -e '/ ^ # / d' / etc / services | plus
Afficher le fichier des services sans les lignes commentées
sed '$ s @ \ ([^:] * \): \ ([^:] * \): \ ([^:] * \
\) @ \ 3: \ 2: \ 1 @ g 'chemin.SMS
Ordre inversé des articles dans la dernière ligne de chemin.SMS
sed -n -e '/ regexp / =; x; 1!p; g; $!N; p; d; '\
-fichier e h.SMS

Imprimez 1 ligne de contexte avant et après la correspondance de ligne,

avec un numéro de ligne où la correspondance se produit

SED '/ regex / x; p; x;' fichier.SMS
Insérez une nouvelle ligne au-dessus de chaque ligne correspondant à Regex
sed '/ aaa /!d; / Bbb /!d; / Ccc /!D 'fichier.SMS
Match AAA, BBB et CCC dans n'importe quel ordre
sed '/ aaa.* BBB.* Ccc /!D 'fichier.SMS
Match AAA, BBB et CCC dans cet ordre
sed -n '/ ^.\ 65 \ / p 'fichier.SMS
Lignes d'impression 65 Chars de long ou plus
sed -n '/ ^.\ 65 \ /!P 'fichier.SMS
Lignes d'impression 65 Chars de long ou moins
fichier sed '/ regex / g'.SMS
Insérer une ligne vide sous chaque ligne
SED '/ regex / x; p; x; g;' fichier.SMS
Insérer une ligne vide au-dessus et en dessous
SED = fichier.txt | sed 'n; s / \ n / \ t /'
Lignes numériques dans le fichier.SMS
sed -e: a -e 's / ^.\ 1,78 \ $ / \
& /; ta 'fichier.SMS
Aligner le texte à droite
sed -e: a -e 's / ^.\ 1,77 \ $ / & /; ta '-e \
'S / \ (* \) \ 1 / \ 1 /' fichier.SMS
Aligner le centre de texte

Conclusion

Ce n'est qu'une partie de ce que l'on peut dire sur SED, mais cette série est censée être un guide pratique, nous espérons donc qu'il vous aidera à découvrir la puissance des outils UNIX et à devenir plus efficace dans votre travail.

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Choses à installer sur Ubuntu 22.04
  • Écoutez votre station de radio préférée avec une seule commande…
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Ubuntu 20.04 Guide
  • Masterring Bash Script Loops