Introduction
- 3573
- 535
- Noa Faure
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 \ | 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' \ | Supprimer toutes les lignes vides traînantes |
sed -e: a -e '/ \\ $ / n; S / \\\ n //; ta '\ | 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 | /; | 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] \ + \) \\ | 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; \ | Remplacer uniquement entre «de» et «jusqu'à» |
sed '/ endnotes: /, $ s / schaff / herzog / g; \ | 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;\ | 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 \\ | 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 \ | 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' \ | Un remplacement de queue |
sed '$!N; / ^ \ (.* \) \ n \ 1 $ /!P; D' \ | Un remplacement UNIQ |
sed '$!N; S / ^ \ (.* \) \ n \ 1 $ / \ 1 /; \ | 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; '\ | 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 '\ | 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 \ | Explicite |
sed -e '/ ^ $ /, / ^ end / s / collines / \ | É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 @ \ ([^:] * \): \ ([^:] * \): \ ([^:] * \ | Ordre inversé des articles dans la dernière ligne de chemin.SMS |
sed -n -e '/ regexp / =; x; 1!p; g; $!N; p; d; '\ | 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 \ $ / \ | Aligner le texte à droite |
sed -e: a -e 's / ^.\ 1,77 \ $ / & /; ta '-e \ | 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