Sed est un éditeur de flux dans un système d'exploitation de type UNIX utilisé pour filtrer et transformer du texte. Sed est dérivé à l'origine de l'éditeur de ligne de base "ed", un éditeur que vous trouverez sur tous les systèmes Unix mais qui est rarement utilisé en raison de son interface utilisateur difficile.
Comment fonctionne sed ?
Comme sed est un éditeur de flux, il effectue son travail sur un flux de données qu'il reçoit de stdin, par exemple via un tube, en écrivant ses résultats sous forme de flux de données sur stdout (souvent un écran de bureau). Nous pouvons rediriger cette sortie vers un fichier . Sed ne modifie généralement pas un fichier d'entrée d'origine ; à la place, nous pouvons envoyer le contenu de notre fichier via un tube pour qu'il soit traité par sed. Cela signifie que nous n'avons pas besoin d'avoir un fichier sur le disque avec les données que vous souhaitez modifier, ceci est particulièrement utile si vous avez des données provenant d'un autre processus plutôt que déjà écrites dans un fichier.
Syntaxe de sed
# sed [option] commands [input-file]
Dans cet article, nous discuterons de certains des exemples pratiques de la commande sed, nous effectuerons de nombreuses opérations sed sur le fichier 'passwd', donc copiez d'abord le fichier '/etc/passwd' dans le dossier /tmp.
# cp /etc/passwd /tmp/
Exemple 1 :Supprimer toutes les lignes avec sed
# cat /tmp/passwd | sed 'd'
La commande ci-dessus a envoyé tout le contenu du fichier /tmp/passwd via un canal vers sed. Gardez à l'esprit que le fichier /tmp/passwd n'a pas du tout été modifié. Sed a seulement lu le contenu du fichier et nous ne lui avons pas dit d'écrire dans le fichier, seulement de le lire. Les résultats des commandes d'édition sur chaque ligne sont imprimés sur la sortie standard. Dans ce cas, rien n'a été imprimé à l'écran car nous avons utilisé l'option 'd' pour supprimer chaque ligne.
Exemple 2 :Invoquer sed avec l'option '-e' (ajouter le script aux commandes à exécuter)
Au lieu d'invoquer sed en lui envoyant un fichier via un tube, nous pouvons demander à sed de lire les données d'un fichier, comme indiqué dans l'exemple ci-dessous.
# sed -e 'd' /tmp/passwd #
Invoquer sed de cette manière définit explicitement la commande d'édition comme un script sed à exécuter sur le fichier d'entrée /tmp/passwd. Le script est simplement une commande d'édition d'un caractère ici, mais il pourrait être beaucoup plus volumineux.
Nous pouvons également rediriger la sortie standard de la commande sed dans un fichier.
# sed -e 'd' /tmp/passwd > /tmp/new-passwd
Exemple 3 :Impression de lignes à l'aide de sed (indicateur -n et commande p)
Le drapeau '-n' désactive l'impression automatique afin que sed n'imprime à la place des lignes que lorsqu'il est explicitement invité à le faire avec la commande 'p'.
# cat /tmp/passwd | sed 'p' | head -5 root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin
Comme nous le voyons ci-dessus, si nous spécifions la commande d'édition "p" sans le drapeau "-n", sed imprimera les lignes en double. Donc, pour afficher des lignes uniques, utilisez le drapeau '-n' avec la commande p dans sed. Des exemples sont présentés ci-dessous :
# cat /tmp/passwd | sed -n 'p' | head -5 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync
Exemple 4 :Modification du fichier source à l'aide de l'option "-i"
La commande Sed par défaut ne modifie pas le fichier original ou source pour notre sécurité, mais en utilisant l'option "-i", le fichier source peut être modifié.
# sed -i '1d' /tmp/passwd
La commande ci-dessus supprimera la première ligne du fichier source /tmp/passwd.
Exemple 5 :Sauvegardez le fichier source avant de le modifier
Lorsque nous utilisons l'option '-i' dans la commande sed, cela devient très risqué car cela modifiera directement le fichier source, il est donc préférable de sauvegarder le fichier source avant de le modifier, l'exemple est illustré ci-dessous.
# sed -i.bak '1d' /tmp/passwd
# ls -l /tmp/passwd* -rw-r--r-- 1 root root 2229 Nov 24 22:36 /tmp/passwd -rw-r--r-- 1 root root 2261 Nov 24 22:35 /tmp/passwd.bak
Dans la commande sed ci-dessus, la 1ère ligne du fichier /tmp/passwd sera supprimée mais avant cette commande sed prend la sauvegarde de /tmp/passwd en tant que /tmp/passwd.bak.
Exemple 6 :suppression des lignes en spécifiant la plage.
Suppression des 5 premières lignes du fichier /tmp/passwd.
# cat /tmp/passwd | sed '1,5d'
Exemple 7 :Supprimer les lignes vides d'un fichier
# cat /tmp/detail.txt 245 678 linux unix suse
Dans le fichier details.txt, nous avons deux lignes vides, utilisez la commande ci-dessous pour supprimer les lignes vides.
# sed '/^$/d' /tmp/detail.txt 245 678 linux unix suse
Exemple 8 :Supprimer les lignes contenant les chaînes
Supposons que nous voulions supprimer la ligne du fichier /tmp/passwd qui contient le mot "jeux".
# sed '/games/d' /tmp/passwd
Exemple 9 :Rechercher et remplacer des chaînes dans le fichier
Supposons que vous vouliez remplacer le « racine » par « Admin », l'exemple est illustré ci-dessous :
# sed 's/root/Admin/' /tmp/passwd
Il est très important de noter que sed remplace uniquement la première occurrence sur une ligne. Si la chaîne 'root' apparaît plus d'une fois sur une ligne, seule la première correspondance sera remplacée. Pour remplacer chaque chaîne du fichier par la nouvelle au lieu de la première occurrence uniquement, pour effectuer une substitution globale, ajoutez une lettre "g" à la fin de la commande, comme indiqué ci-dessous :
# sed 's/root/Admin/g' /tmp/passwd
Exemple 10 :substitution multiple à l'aide de l'option -e
Supposons que nous voulions remplacer la chaîne "root" par "Admin" et la chaîne "bash" par "sh". L'exemple est illustré ci-dessous :
# cat /tmp/passwd | sed -e 's/root/Admin/g' -e 's/bash/sh/g'