Dans le post précédent, nous avons parlé des fonctions bash et comment les utiliser directement depuis la ligne de commande, et nous avons vu d’autres trucs sympas. Aujourd’hui, nous allons parler d’un outil pratique pour la manipulation des chaînes de caractères appelé sed ou commande sed Linux.
Nous utilisons sed pour travailler avec des fichiers texte comme les fichiers journaux, les fichiers de configuration et d’autres fichiers texte.
Dans ce post, nous allons nous concentrer sur la commande sed Linux, qui est utilisée pour la manipulation de texte, ce qui est une étape essentielle dans notre voyage de script bash.
Le système Linux fournit certains outils pour le traitement de texte ; l’un de ces outils est sed.
Nous allons discuter des 31+ exemples avec des images pour montrer la sortie de chaque exemple.
Table des matières
Comprendre la commande sed Linux
La commande sed est un éditeur de texte non interactif. La commande sed Linux édite les données en fonction des règles que vous fournissez ; vous pouvez l’utiliser comme ceci :
$ sed options file
Vous n’êtes pas limité à utiliser sed pour manipuler des fichiers ; vous l’appliquez directement au STDIN comme ceci :
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'
La commande s remplace le premier texte par le second motif de texte. Dans ce cas, nous avons remplacé la chaîne « site web » par le mot « page ».
L’exemple ci-dessus était un exemple simple pour démontrer l’outil. Nous pouvons également utiliser la commande Linux sed pour manipuler des fichiers.
Créons un fichier exemple :
$ sed 's/test/another test/' ./myfile
Les résultats sont imprimés à l’écran instantanément ; vous n’avez pas à attendre le traitement du fichier jusqu’à la fin.
Si votre fichier est suffisamment massif, vous verrez le résultat avant que le traitement ne soit terminé.
La commande SED Linux ne met pas à jour vos données. Elle envoie seulement le texte modifié à STDOUT. Le fichier n’est toujours pas touché. Si vous avez besoin d’écraser le contenu existant, vous pouvez consulter notre précédent post, qui parlait des redirections.
Utiliser plusieurs commandes sed Linux dans la ligne de commande
Pour exécuter plusieurs commandes sed, vous pouvez utiliser l’option -e comme ceci :
$ sed -e 's/This/That/; s/test/another test/' ./myfile
Vous devez séparer les commandes sed par un point-virgule sans espace.
Vous pouvez également utiliser un guillemet simple pour séparer les commandes comme ceci :
$ sed -e '> s/This/That/> s/test/another test/' myfile
Le même résultat, pas de problème.
Lecture de commandes depuis un fichier
Vous pouvez enregistrer vos commandes sed dans un fichier et les utiliser en spécifiant le fichier à l’aide de l’option -f.
$ cat mycommandss/This/That/s/test/another test/
$ sed -f mycommands myfile
Substituer des drapeaux
Regardez attentivement l’exemple suivant :
$ cat myfile
$ sed 's/test/another test/' myfile
Le résultat ci-dessus montre que nous avons remplacé la première occurrence dans chaque ligne. Pour remplacer toutes les occurrences d’un motif, utilisez l’un des drapeaux de substitution suivants.
Nous pouvons écrire les drapeaux comme ceci :
s/pattern/replacement/flags
Il existe quatre types de substitutions :
- g, remplacer toutes les occurrences.
- Un nombre, le numéro d’occurrence du nouveau texte que vous voulez remplacer.
- p, imprimer le contenu original.
- w fichier : signifie écrire les résultats dans un fichier.
Vous pouvez limiter votre remplacement en spécifiant le numéro d’occurrence qui doit être remplacé comme ceci :
$ sed 's/test/another test/2' myfile
Comme vous pouvez le voir, nous avons remplacé uniquement la deuxième occurrence sur chaque ligne.
Le drapeau g signifie global, ce qui signifie un remplacement global pour toutes les occurrences:
$ sed 's/test/another test/g' myfile
Le drapeau p imprime chaque ligne contient une correspondance de motif, vous pouvez utiliser l’option -n pour imprimer uniquement les lignes modifiées.
$ cat myfile
$ sed -n 's/test/another test/p' myfile
Le drapeau w enregistre la sortie dans un fichier spécifié :
$ sed 's/test/another test/w output' myfile
Nous avons imprimé la sortie à l’écran, mais nous avons enregistré les lignes correspondantes dans le fichier de sortie.
Remplacer des caractères
Supposons que vous vouliez rechercher le shell bash et le remplacer par le shell csh dans le fichier /etc/passwd en utilisant sed, eh bien, vous pouvez le faire facilement :
$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
Oh ! !! cela a l’air terrible.
Heureusement, il existe une autre façon d’y parvenir. Vous pouvez utiliser le point d’exclamation ( !) comme délimiteur de chaîne de caractères comme ceci:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
Maintenant, c’est plus facile à lire.
Limiter sed
La commande sed traite l’intégralité de votre fichier. Cependant, vous pouvez limiter la commande sed pour qu’elle traite des lignes spécifiques ; il existe deux façons :
- Une plage de lignes.
- Un motif qui correspond à une ligne spécifique.
Vous pouvez taper un chiffre pour le limiter à une ligne spécifique:
$ sed '2s/test/another test/' myfile
Nous avons modifié uniquement la ligne deux.
Et si on utilisait une plage de lignes :
$ sed '2,3s/test/another test/' myfile
On peut aussi partir d’une ligne jusqu’à la fin du fichier :
$ sed '2,$s/test/another test/' myfile
Ou vous pouvez utiliser un motif comme celui-ci :
$ sed '/likegeeks/s/bash/csh/' /etc/passwd
Awesome !!
Vous pouvez utiliser des expressions régulières pour écrire ce motif afin qu’il soit plus générique et utile.
Supprimer des lignes
Pour supprimer des lignes en utilisant sed, vous pouvez utiliser le drapeau delete (d) est votre ami.
Le drapeau delete supprime le texte du flux, pas le fichier d’origine.
$ sed '2d' myfile
Ici, nous supprimons la deuxième ligne seulement de monfichier.
Qu’en est-il de la suppression d’une plage de lignes ?
$ sed '2,3d' myfile
Ici, nous supprimons une plage de lignes, la deuxième et la troisième.
Un autre type de plages :
$ sed '3,$d' myfile
Ici nous supprimons de la troisième ligne à la fin du fichier.
Tous ces exemples ne modifient jamais votre fichier original.
$ sed '/test 1/d' myfile
Ici, nous utilisons un motif pour supprimer la ligne s’il correspond à la première ligne.
Si vous devez supprimer une plage de lignes, vous pouvez utiliser deux motifs de texte comme ceci :
$ sed '/second/,/fourth/d' myfile
Nous avons supprimé de la deuxième à la quatrième ligne.
Insérer et ajouter du texte
Vous pouvez insérer ou ajouter des lignes de texte en utilisant les drapeaux suivants :
- Le drapeau (i).
- Le drapeau (a).
$ echo "Another test" | sed 'i\First test '
Nous avons ajouté le texte avant la ligne spécifiée.
$ echo "Another test" | sed 'a\First test '
Nous avons ajouté le texte après la ligne spécifiée.
Et si on ajoutait du texte au milieu ?
Facile, regardez l’exemple suivant :
$ sed '2i\This is the inserted line.' myfile
Et l’ajout fonctionne de la même manière, mais regardez la position du texte ajouté :
$ sed '2a\This is the appended line.' myfile
Nous avons utilisé les mêmes drapeaux mais avec un emplacement d’insertion ou d’ajout.
Modification des lignes
Pour modifier une ligne spécifique, vous pouvez utiliser le drapeau (c) comme ceci:
$ sed '3c\This is a modified line.' myfile
Vous pouvez utiliser un motif d’expression régulière, et toutes les lignes correspondant à ce motif seront modifiées.
$ sed '/This is/c Line updated.' myfile
Transformer les caractères
Le drapeau de transformation (y) fonctionne sur des caractères comme celui-ci :
$ sed 'y/123/567/' myfile
Nous avons appliqué la transformation à toutes les données, et nous ne pouvons pas la limiter à une occurrence spécifique.
Imprimer les numéros de ligne
Vous pouvez imprimer le numéro de ligne en utilisant le signe (=) comme ceci :
$ sed '=' myfile
Cependant, en utilisant -n combiné au signe égal, la commande sed affiche le numéro de ligne qui contient la correspondance.
$ sed -n '/test/=' myfile
Lire les données d’un fichier
Vous pouvez utiliser le drapeau (r) pour lire les données d’un fichier.
Vous pouvez définir un numéro de ligne ou un modèle de texte pour le texte que vous voulez lire.
$ cat newfile
$ sed '3r newfile' myfile
Nous avons inséré le contenu après la troisième ligne comme prévu.
Et voici l’utilisation d’un motif textuel :
$ sed '/test/r newfile' myfile
Cool non ?
Exemples utiles
Supposons que nous avons un fichier qui contient du texte avec un espace réservé, et que nous avons un autre fichier qui contient les données qui rempliront l’espace réservé sur l’autre fichier.
Nous utiliserons les drapeaux (r) et (d) pour faire le travail.
Le mot DATA dans ce fichier est un espace réservé pour un contenu réel que nous stockerons dans un autre fichier appelé data.
Nous allons le remplacer par le contenu réel :
$ Sed '/DATA>/ {r newfiled}' myfile
Awesome ! !! comme vous pouvez le voir, nous avons rempli l’emplacement placeholder avec les données de l’autre fichier.
Ce n’est qu’une petite intro sur la commande sed. La commande sed Linux est un autre monde en soi.
La seule limite est votre imagination.
J’espère que vous trouverez facile de manipuler des chaînes de caractères en utilisant la commande sed Linux.
Merci.
Fondateur de LikeGeeks. Je travaille en tant qu’administrateur système Linux depuis 2010. Je suis responsable de la maintenance, de la sécurisation et du dépannage des serveurs Linux pour plusieurs clients dans le monde. J’adore écrire des scripts shell et Python pour automatiser mon travail.
.