Administrateur Linux - Commande sed

sedest un utilitaire complexe à maîtriser. Cette commande diffuse l'éditeur pour filtrer et transformer le texte. Des livres entiers ont été écrits pour utiliser sed avec compétence. Gardez donc à l'esprit que ce tutoriel a pour but d'introduire trois utilisations courantes de base de sed -

  • substitution de caractères
  • opérations d'impression
  • supprimer des opérations

La syntaxe de commande courante pour sed est -

sed [options] [file to operate on]

Voici les commutateurs sed courants à retenir.

Commutateur action
-je Modifiez les fichiers sur place au lieu du flux, -i [SUFFIX] pour créer un fichier de sauvegarde
-e Ajouter les commandes de script à exécuter
-n Silencieux, supprime l'impression automatique
-r ReGex, utilisez des expressions régulières étendues dans le script

-iappliquera les modifications à un fichier, au lieu de modifier le flux du fichier tel qu'il est passé à sed .

sed , lorsqu'il est utilisé avec le-eL'option étend la commande pour traiter plusieurs opérations sur un flux. Cela peut être fait à la place en utilisant sed de manière récursive.

echo "Windows and IIS run the Internet" | sed -e 's/Windows/Linux/' -e 's/ and           
IIS//'  -e 's/run/runs/' 
Linux runs the Internet

le -nL'option avec sed supprime l'impression par défaut sur stdout. En utilisant la commande print de sed, comme nous le voyons, chaque ligne sera dupliquée sur stdout.

bash-3.2# sed 'p' ./lines.txt  
line1 
line1 
line2 
line2

Cette fois, nous utilisons l' option -n avec sed -

bash-3.2# sed -n 'p' ./lines.txt  
line1 
line2

sed enverra des flux de contenu à stdout. Lorsque la commande « p » ou print est ajoutée, un flux séparé est envoyé pour chaque ligne, ce qui entraîne la duplication de toutes les lignes dans stdout.

commande de substitution sed

Cette commande est spécifiée avec le 's'option. Nous avons déjà vu sed utilisé avec sa commande de substitution à quelques reprises. Voici un exemple simple -

[[email protected] Documents]# echo "developers eat veggies and fruit" | sed -e
's/veggies/pizza/' -e 's/fruit/coffee/' 
developers eat pizza and coffee 
[[email protected] Documents]#

Essayons celui-ci, sur un fichier nommé dev.txt -

[[email protected] centos]# cat dev.txt  
Developers code all night and sleep all day.
[[email protected] centos]#

Maintenant, changeons le contenu d'un fichier au lieu de simplement son flux de sortie envoyé à sed -

[[email protected] centos]# sed -ibak 's/sleep/code/' ./dev.txt  
[[email protected] centos]# ls dev* 
dev.txt  dev.txtbak 
[[email protected] centos]# cat dev* 
Developers code all night and code all day. 
Developers code all night and sleep all day. 
[[email protected] centos]#

Note - Nous avons utilisé -i option avec un suffixe unique pour créer un fichier de sauvegarde.

commande d'impression sed

Cette commande est spécifiée avec la commande ' p '.

Utilisons notre fichier names.txt, la sortie a été éditée par souci de brièveté -

[[email protected] Documents]# sed -n "p" ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305

sed permet d'utiliser des "adresses", pour définir plus précisément ce qui est imprimé sur stdout -

[[email protected] Documents]# sed -n "1,10p" ./names.txt
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Marian:Little:903 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Dale:Barton:901 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
[[email protected] Documents]#

Tout comme head , nous avons imprimé les 10 premières lignes de notre fichier names.txt.

Et si nous voulions seulement imprimer ceux avec un bureau au 9e étage?

[[email protected] Documents]# sed -n "/90/p" ./names.txt 
Marian:Little:903 
Dale:Barton:901 
Kellie:Curtis:903: 
Gina:Carr:902 
Antonia:Lucas:901 
[[email protected] Documents]#

Plutôt facile. Nous pouvons également imprimer tout le monde, sauf ceux avec des bureaux au 9ème étage -

[[email protected] Documents]# sed -n '/90/ !p' ./names.txt 
Ted:Daniel:101 
Jenny:Colon:608 
Dana:Maxwell:602 
Bobbie:Chapman:403 
Nicolas:Singleton:203 
Aaron:Dennis:305 
Santos:Andrews:504 
Jacqueline:Neal:102 
Billy:Crawford:301 
Rosa:Summers:405 
Matt:Davis:305 
Francisco:Gilbert:101
Sidney:Mac:100 
Heidi:Simmons:204 
Matt:Davis:205 
Cristina:Torres:206 
Sonya:Weaver:403 
Donald:Evans:403

Dans le code ci-dessus, nous avons annulé 'p'opération d'impression entre / et / avec !. Cela fonctionne de la même manière que la commande «d» ou supprimer . Cependant, les résultats peuvent varier avec la négation dans sed . Donc en règle générale: p pour imprimer et annuler ce que vous ne voulez pas.

commande sed delete

Comme mentionné, la commande delete est l'opposé de la commande sed print. Commençons par notre fichier name.txt -

[[email protected] Documents]# sed 'd' ./names.txt  
[[email protected] Documents]#

Rien n'est imprimé. Avec la commande ci-dessus, nous avons demandé à sed de supprimer chaque ligne de stdout dans le flux. Maintenant, imprimons uniquement les deux premières lignes et "supprimons" le reste du flux -

[[email protected] Documents]# sed '1,2 !d' ./names.txt  
Ted:Daniel:101 
Jenny:Colon:608
[[email protected] Documents]#

Voir? Similaire à la commande « p » ou print. Maintenant, faisons quelque chose d'utile avec la commande de suppression. Disons que nous voulons supprimer toutes les lignes vides d'un fichier -

[[email protected] Documents]# cat lines.txt  
line1 
line2 
line3 
line4 
line5 
[[email protected] Documents]#

Il n'est pas rare de recevoir un fichier comme celui-ci contenant du texte brouillé, en copiant et en collant un e-mail ou formaté avec des sauts de ligne non standard. Au lieu d'éditer interactivement le fichier dans vim, nous pouvons utiliser sed pour faire le travail à notre place.

[[email protected] Documents]# sed -i '/^\s*$/ d' ./lines.txt
[[email protected] Documents]# cat ./lines.txt  
line1 
line2 
line3 
line4 
line5 
[[email protected] Documents]#

Le fichier est maintenant formaté de manière facilement lisible.

Note - Lorsque vous modifiez les fichiers importants, utilisez -icommutateur. L'ajout d'un suffixe de sauvegarde de fichier est fortement conseillé pour réserver le contenu du fichier ( sed peut apporter des modifications extrêmes avec la moindre faute de frappe).