Introduction
L'éditeur sed traite les fichiers (ou entrées) ligne par ligne et envoie les résultats vers l'écran. Le processus fonctionne comme suit : sed stocke la ligne actuellement traitée dans une zone tampon temporaire (également appelée espace de motif), traite cette ligne dans la zone tampon, puis envoie le résultat vers l'écran. Après avoir traité chaque ligne, sed la supprime de la zone tampon, lit la ligne suivante, la traite et l'affiche. Une fois la dernière ligne du fichier d'entrée traitée, sed termine son exécution. Comme sed travaille sur une copie de chaque ligne dans la zone tampon, il ne modifie pas le fichier original.
Flux d'Exécution de Sed
L'exécution des scripts sed suit un ordre simple et mémorable : Lire, Exécuter, Imprimer, Répéter (LEIR), abrégé en REPR.
Analysons l'ordre d'exécution du script :
Lire une ligne dans l'espace de motif (une zone tampon temporaire interne à sed pour stocker le contenu lu)
Exécuter les commandes dans l'espace de motif. Si plusieurs commandes sont spécifiées avec { } ou -e, sed les exécute séquentiellement
Imprimer le contenu de l'espace de motif, puis le vider
Répéter le processus jusqu'à la fin du fichier
Comme illustré :
L'éditor sed traite les fichiers (ou entrées) ligne par ligne et envoie les résultats vers l'écran. Le processus fonctionne comme suit : tout d'abord, sed stocke la ligne actuellement traitée dans une zone tampon temporaire (également appelée espace de motif), puis traite cette ligne dans la zone tampon, et enfin envoie le résultat vers l'écran. Après avoir traité chaque ligne, sed la supprime de la zone tampon, lit la ligne suivante, la traite et l'affiche. Une fois la dernière ligne du fichier d'entrée traitée, sed termine son exécution.
Comme mentionné précédemment, sed ne modifie pas les fichiers car il travaille sur une copie de chaque ligne dans la zone tampon, effectuant ainsi l'édition sur cette copie plutôt que sur le fichier original.
Présentation des Méthodes d'Utilisation de Sed
Sed présente deux formats de syntaxe courants : le format en ligne de commande et le format de script.
Format de commande sed : sed [option] 'commande sed' nom_fichier
Format de script sed : sed [option] -f 'script sed' nom_fichier<br></br><br></br>
- Format en Ligne de Commande
Syntaxe
sed [options] 'action de traitement' nom_fichier
sed [option] 'commande sed|localisation d'adresse' nom_fichier
Remarque : l'action de traitement correspond à la commande sed
Explication : pour引用 des variables de script shell, il faut utiliser des guillemets doubles, plutôt que les guillemets simples habituellement utilisés
Options de Commande Sed
<br></br>-e Effectue directement l'édition par action sed en ligne de commande, option par défaut<br></br>-f Écrit les actions sed dans un fichier, exécute les actions du fichier avec –f nom_fichier<br></br>-i Modifie directement le contenu du fichier<br></br>-n N'imprime que les lignes correspondant au motif ; annule la sortie par défaut<br></br>-r Prend en charge les expressions régulières étendues<br></br>-h --help Affiche l'aide<br></br>-v --version Affiche les informations de version<br></br><br></br>
Commandes Courantes Sed (sed command) ou Actions de Traitement
Remarque : toutes les actions suivantes doivent être entre guillemets simples
<br></br><br></br>a\ Ajoute une ou plusieurs lignes après la ligne actuelle. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par \ pour être poursuivie<br></br>c\ Remplace le texte de la ligne actuelle par le nouveau texte qui suit ce symbole. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par \" pour être poursuivie<br></br>i\ Insère du texte avant la ligne actuelle. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par \" pour être poursuivie<br></br>d Supprime la ligne ; supprime les lignes sélectionnées<br></br>D Supprime la première ligne du bloc de motif<br></br>s Remplace une chaîne de caractères par une autre<br></br><br></br>h Copie le contenu de l'espace de motif vers la zone tampon temporaire ; copie le contenu du bloc de motif vers la zone tampon mémoire<br></br>H Ajoute le contenu de l'espace de motif vers la zone tampon temporaire ; ajoute le contenu du bloc de motif vers la zone tampon mémoire<br></br>g Copie le contenu de la zone tampon vers l'espace de motif, écrasant le contenu existant ; récupère le contenu de la zone tampon mémoire et remplace le texte du bloc de motif actuel<br></br>G Ajoute le contenu de la zone tampon à l'espace de motif, après le contenu existant ; récupère le contenu de la zone tampon mémoire et l'ajoute après le texte du bloc de motif actuel<br></br><br></br><br></br>l Liste les caractères non imprimables ; affiche la liste des caractères qui ne peuvent pas être imprimés<br></br>p Imprime la ligne ; imprime les lignes du bloc de motif<br></br>P Imprime la première ligne du bloc de motif<br></br>n Lit la ligne d'entrée suivante et commence son traitement avec la commande suivante plutôt qu'avec la première commande ; lit la ligne d'entrée suivante et la traite avec la commande suivante plutôt qu'avec la première<br></br>N Ajoute la ligne d'entrée suivante au bloc de motif et insère un saut de ligne entre les deux, change le numéro de ligne actuel<br></br>q Terminer ou quitter sed<br></br><br></br>r fichier Lit les lignes d'entrée du fichier ; lit les lignes du fichier<br></br>w fichier Écrit les lignes sélectionnées dans un fichier ; écrit et ajoute la première ligne du bloc de motif à la fin du fichier<br></br>= Imprime le numéro de ligne actuel<br></br># Étend le commentaire jusqu'au prochain saut de ligne<br></br>! Applique la commande à toutes les lignes non sélectionnées ; indique que la commande suivante s'applique à toutes les lignes non sélectionnées<br></br><br></br>étiquette Branche vers l'endroit marqué dans le script, si la branche n'existe pas, elle branche à la fin du script<br></br>t étiquette si branche, à partir de la dernière ligne, dès que la condition est remplie ou par les commandes T, t, cela provoquera un branchement vers la commande étiquetée ou à la fin du script<br></br>T étiquette branche d'erreur, à partir de la dernière ligne, dès qu'une erreur se produit ou par les commandes T, t, cela provoquera un branchement vers la commande étiquetée ou à la fin du script
Marqueurs de Substitution Sed
g Substitution globale dans la ligne
p Imprime la ligne
w Écrit la ligne dans un fichier
x Échange le texte du bloc de motif et le texte de la zone tampon ; échange le contenu de la zone tampon temporaire et de l'espace de motif
y Remplace un caractère par un autre (ne peut pas être utilisé avec les expressions régulières)
\1 Marqueur de sous-chaîne correspondante
& Marqueur de chaîne correspondante ; sauvegarde la chaîne de recherche pour référence dans la chaîne de remplacement
Ensemble de Métacaractères Sed
Comme grep, sed prend également en charge les métacaractères spéciaux pour effectuer des recherches et des substitutions de motifs. La différence est que les expresisons régulières utilisées par sed sont des motifs entourés de barres obliques "/" .
Si vous souhaitez modifier le séparateur d'expression régulière "/" par un autre caractère, par exemple "o", il suffit d'ajouter une barre oblique inverse avant ce caractère, puis l'expression régulière, puis ce caractère. Par exemple :
sed -n '\o^Monop' fichier_données
Plus précisément :
^ Ancre le contenu correspondant au début de la ligne, format d'utilisation "^motif" ; par exemple /^mon/ correspond à toutes les lignes commençant par mon
$ Ancre le contenu correspondant à la fin de la ligne, format d'utilisation "motif$" ; par exemple : /mon$/ correspond à toutes les lignes se terminant par mon
^$ Ligne vide
. Correspond à n'importe quel caractère sauf le saut de ligne ; /m..y/ correspond aux lignes contenant la lettre m, suivie de deux caractères quelconques, puis la lettre y* Correspond à zéro, une ou plusieurs occurrences du caractère précédent ; par exemple /mon*/ correspond aux lignes contenant la lettre m, suivie de zéro ou plusieurs lettres y
.* Correspond à n'importe quelle longueur de caractères quelconques
\? Correspond à zéro ou une occurrence du caractère précédent
x\{m,n\} Répète le caractère x, au moins m fois, pas plus de n fois /0\{5,10\}/ correspond aux lignes avec 5~10 zéros
x\{m,\} Répète le caractère x, au moins m fois /0\{5,\}/ correspond aux lignes avec au moins 5 zéros
x\{m\} Répète le caractère x, m fois /0\{5\}/ correspond aux lignes contenant exactement 5 zéros
/< \<mon/ correspond aux lignes contenant des mots commençant par mon\> Ancre de fin de mot /mon\>/ correspond aux lignes contenant des mots se terminant par mon
\<motif\> Ancre de mot
[] Correspond à n'importe quel caractère unique de la plage spécifiée ; /[Mm]on/ correspond aux lignes contenant Mon ou mon
[^] Correspond à n'importe quel caractère unique en dehors de la plage spécifiée ; par exemple /[^A-RT-Z]ed/ correspond aux lignes commençant par autre chose que A-R et T-Z, suivies de ed
\(..\) Sauvegarde les caractères correspondants ; ```
s/J\(aime\)\(toi\)/\2\1moi J'aime toi -> toi aime moi
```& Sauvegarde la chaîne de recherche pour référence dans la chaîne de remplacement ; ```
s/aime/**&**/, aime -> **aime**
[:digit:] Tous les chiffres, équivalent de 0-9, [0-9]---> [[:digit:]] [:lower:] Toutes les lettres minuscules [:upper:] Toutes les lettres majuscules [:alpha:] Toutes les lettres [:alnum:] Équivalent de 0-9a-zA-Z [:space:] Caractères d'espacement [:punct:] Tous les signes de ponctuation
</div>Exemple :
<div>```
#######sed prend en charge les expressions régulières pour la correspondance de motifs#####################
sed'5 q'/etc/passwd#affiche les 5 premières lignes
sed-n '/r*t/p'/etc/passwd#affiche les lignes correspondant à r avec 0 ou plusieurs occurrences, suivies d'un caractère t
sed-n '/.r.*/p'/etc/passwd#affiche les lignes contenant r et suivie de n'importe quel caractère
sed-n '/o*/p'/etc/passwd#affiche les lignes avec le caractère o répété un nombre quelconque de fois
sed-n '/o\{1,\}/p'/etc/passwd#affiche les lignes avec le caractère o apparaissant au moins une fois
sed-n '/o\{1,3\}/p'/etc/passwd#affiche les lignes avec le caractère o apparaissant de 1 à 3 fois
Adressage Sed
L'adressage détermine quelles lignes traiter. L'adresse peut être un numéro, une expression régulière, ou une combinaison des deux. Si aucune adresse n'est spécifiée, sed traitera toutes les lignes du fichier d'entrée.
Si l'adresse est un numéro, elle représente un numéro de ligne ; le symbole "$" représente la dernière ligne.
Si l'adresse est séparée par une virgule, elle représente une plage entre deux lignes (incluant ces deux lignes).
premier~pas premier indique la ligne de départ correspondance, pas indique l'incrément, par exemple : sed -n 2~5p signifie : correspond à partir de la ligne 2, toutes les 5 lignes, c'est-à-dire 2,7,12…
$ $ signifie correspondre à la dernière ligne
/REGEXP/ signifie correspondre à la ligne avec l'expression régulière, correspond via l'expression régulière entre //
\cREGEXPc cela signifie correspondre à la ligne avec l'expression régulière, via l'expression régulière entre \c et c, c peut être n'importe quel caractère
addr1, add2 L'adressage addr1, add2 détermine quelles lignes éditer. Les adresses peuvent être des numéros, des expressions régulières ou une combinaison des deux.<br></br> Si aucune adresse n'est spécifiée, sed traitera toutes les lignes du fichier d'entrée. Si l'adressage est un numéro, ce numéro représente le numéro de ligne, si c'est deux numéros séparés par une virgule,<br></br> alors l'adressage à traiter est la plage entre les deux lignes (incluant ces deux lignes). La plage peut être numérique, régulière ou une combinaison.
addr1, +N De la ligne addr1 jusqu'à N lignes plus bas, correspondant à un total de N+1 lignes
addr1, ~N Correspondra à addr1 et aux lignes suivantes jusqu'à la ligne dont le numéro est un multiple de N suivant<br></br><br></br><br></br>x x est un numéro de ligne spécifique
x,y Indique les lignes de x à y
/motif Recherche les lignes contenant le motif
/motif /motif Recherche les lignes contenant deux motifs
motif,x Recherche les lignes contenant le motif jusqu'à la ligne x
x,/motif/ Recherche les lignes correspondantes par numéro de ligne et motif
x,y! Recherche les lignes ne contenant pas les numéros de ligne x et y
Figure 1:
Figure 2:
Figure 3:
Exemples Illustratifs
Préparation du fichier
# vim donnees.txt
administrateur:x:0:0:administrateur:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1
1. Opérations d'ajout, suppression, modification et recherche sur le fichier
Syntaxe : sed options 'localisation+commande' fichier à traiter
1.Afficher le contenu du fichier
[serveur~]# sed '' donnees.txt Ne fait rien sur le fichier
[serveur~]# sed -n 'p' donnees.txt Affiche chaque ligne, annule la sortie par défaut
[serveur~]# sed -n '1p' donnees.txt Affiche la ligne 1
[serveur~]# sed -n '2p' donnees.txt Affiche la ligne 2
[serveur~]# sed -n '1,5p' donnees.txt Affiche les lignes 1 à 5
[serveur~]# sed -n '$p' donnees.txt Affiche la dernière ligne
2.Ajout de contenu au fichier
i Insertion au-dessus de l'adresse localisée
Insère du texte avant la ligne actuelle. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par "\" pour être poursuivie vim→O
a Insertion en dessous
Ajoute une ou plusieurs lignes après la ligne actuelle. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par "\" pour être poursuivie vim→o
[serveur~]# sed '$a99999' donnees.txt Ajoute du contenu sous la dernière ligne du fichier
[serveur~]# sed 'a99999' donnees.txt Ajoute du contenu sous chaque ligne du fichier
[serveur~]# sed '5a99999' donnees.txt Ajoute du contenu sous la ligne 5 du fichier
[serveur~]# sed '$i99999' donnees.txt Ajoute du contenu au-dessus de la dernière ligne du fichier
[serveur~]# sed 'i99999' donnees.txt Ajoute du contenu au-dessus de chaque ligne du fichier
[serveur~]# sed '6i99999' donnees.txt Ajoute du contenu au-dessus de la ligne 6 du fichier
[serveur~]# sed '/^uucp/ihello' Insère du contenu au-dessus des lignes commençant par uucp
3.Modification du contenu du fichier
c Remplacement du contenu de la ligne spécifiée
Remplace le texte de la ligne actuelle par le nouveau texte qui suit ce symbole. Pour plusieurs lignes, sauf la dernière, chaque ligne doit se terminer par "\" pour être poursuivie Remplacement de toute la ligne
[serveur~]# sed '5chello world' donnees.txt Remplace le contenu de la ligne 5
[serveur~]# sed 'chello world' donnees.txt Remplace tout le contenu du fichier
[serveur~]# sed '1,5chello world' donnees.txt Remplace le contenu des lignes 1 à 5 par hello world
[serveur~]# sed '/^utilisateur01/c888888' donnees.txt Remplace les lignes commençant par utilisateur01
4.Suppression du contenu du fichier
[serveur~]# sed '1d' donnees.txt Supprime la ligne 1 du fichier
[serveur~]# sed '1,5d' donnees.txt Supprime les lignes 1 à 5 du fichier
[serveur~]# sed '$d' donnees.txt Supprime la dernière ligne du fichier
2. Opérations de recherche et substitution sur le fichier
Syntaxe : sed options 's/recherche/substitution/action' fichier à traiter
Où s signifie search (recherche) ; les barres obliques / sont des séparateurs qui peuvent être personnalisés ; l'action est généralement l'impression p et le remplacement global g
[serveur~]# sed -n 's/administrateur/ADMINISTRATEUR/p' 1.txt
[serveur~]# sed -n 's/administrateur/ADMINISTRATEUR/gp' 1.txt
[serveur~]# sed -n 's/^#//gp' 1.txt
[serveur~]# sed -n 's@/sbin/nologin@formation@gp' donnees.txt
[serveur~]# sed -n 's/\/sbin\/nologin/formation/gp' donnees.txt
[serveur~]# sed -n '10s#/sbin/nologin#formation#p' donnees.txt
uucp:x:10:14:uucp:/var/spool/uucp:formation
[serveur~]# sed -n 's@/sbin/nologin@formationentreprise@p' 2.txt
Remarque : les séparateurs de recherche et substitution peuvent être personnalisés
[serveur~]# sed -n '1,5s/^/#/p' donnees.txt Commente les lignes 1-5 du fichier
#administrateur:x:0:0:administrateur:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Point important : la commande sed permet de remplacer le contenu des fichiers (l'opération de remplacement est la plus utilisée dans les scripts d'automatisation shell)****
#================ Contenu du fichier source ===============================
[serveur~]# cat test
anonymous_enable=OUI
write_enable=OUI
local_umask=022
xferlog_enable=OUI
connect_from_port_20=OUI
administrateur:x:0:0:administrateur:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
DISPOSITIF="eth0"
PROTOCOLE="statique"
ADRESSE_MAC="00:0C:29:90:79:78"
DEMARRAGE="oui"
IPADDR=172.16.22.1
MASQUE=255.255.0.0
#===================== Commandes sed exécutées ================================
[serveur~]# sed -i '/DISPOSITIF/c\Reseau' test
#Correspond à la ligne avec DISPOSITIF, remplace par Reseau
[serveur~]# sed -i 's/statique/dhcp/' test
#Remplace statique par dhcp(/,@,# sont les délimiteurs d'adresse mentionnés précédemment)
[serveur~]# sed -i '/IPADDR/s@22\.1@10.12@' test
#Correspond à la ligne avec IPADDR, remplace 22.1 par 10.12, le . doit être échappé car il a une signification spéciale
[serveur~]# sed -i '/connect/s#OUI#NON#' test
#Correspond à la ligne avec connect, remplace OUI par NON
[serveur~]# sed -i 's/bin/tom/2g' test
#Dans toutes les lignes correspondant à bin, remplace bin par tom à partir de la deuxième occurrence et suivantes
[serveur~]# sed -i 's/daemon/jerry/2p' test
#Dans toutes les lignes correspondant à daemon, remplace la deuxième occurrence de daemon par jerry, et produit une ligne identique
[serveur~]# sed -i 's/adm/chef/2' test
#Dans toutes les lignes correspondant à adm, remplace uniquement la deuxième occurrence de adm par chef
[serveur~]# sed -i '/administrateur/{s/bash/nologin/;s/0/1/g}' test
#Correspond aux lignes avec administrateur, remplace bash par nologin, et remplace 0 par 1
[serveur~]# sed -i 's/administrateur/(&)/g' test
#Met administrateur entre parenthèses, & représente le caractère correspondant précédent
[serveur~]# sed -i 's/PROTOCOLE/#PROTOCOLE/' test
#Correspond à PROTOCOLE, remplace par #PROTOCOLE, généralement utilisé pour commenter une ligne dans les fichiers de configuration
[serveur~]# sed -i 's/DEMARRAGE/#&/' test
#Correspond à la ligne avec DEMARRAGE, ajoute # devant, généralement utilisé pour commenter une ligne dans les fichiers de configuration
[serveur~]# sed -i '/DEMARRAGE/s/#//' test
#Correspond à la ligne avec DEMARRAGE, remplace # par vide, c'est-à-dire supprime #, généralement utilisé pour décommenter une ligne
#================ Contenu du fichier après exécution des commandes sed ====================
[serveur~]# cat test
anonymous_enable=OUI
write_enable=OUI
local_umask=022
xferlog_enable=OUI
connect_from_port_20=NON
(administrateur):x:1:1:(administrateur):/(administrateur):/bin/nologin
bin:x:1:1:tom:/tom:/stom/nologin
daemon:x:2:2:jerry:/sbin:/stom/nologin
daemon:x:2:2:jerry:/sbin:/stom/nologin
adm:x:3:4:chef:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Reseau
#PROTOCOLE="dhcp"
ADRESSE_MAC="00:0C:29:90:79:78"
DEMARRAGE="oui"
IPADDR=172.16.10.12
MASQUE=255.255.0.0
3.Autres commandes
Commande Explication Remarque
r Lit le contenu d'un autre fichier
w Enregistre le contenu dans un autre fichier
& Sauvegarde la chaîne de recherche pour référence dans la chaîne de remplacement Identique à \(\)
= Affiche le numéro de ligne
! Applique la commande à toutes les lignes sauf celles sélectionnées, placé après le numéro de ligne '1,5!'
q Quitter
Exemples :
r Lit le contenu d'un autre fichier
w Enregistre les lignes sélectionnées dans un fichier
[serveur~]# sed '3r /etc/hosts' 2.txt
[serveur~]# sed '$r /etc/hosts' 2.txt
[serveur~]# sed '/administrateur/w donnees.txt' 2.txt
[serveur~]# sed '/[0-9]{4}/w donnees.txt' 2.txt
[serveur~]# sed -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/w b.txt' 2.txt
! Applique la commande à toutes les lignes sauf celles sélectionnées, placé après le numéro de ligne
[serveur~]# sed -n '1!p' 1.txt
[serveur~]# sed -n '4p' 1.txt
[serveur~]# sed -n '4!p' 1.txt
[serveur~]# cat -n 1.txt
[serveur~]# sed -n '1,17p' 1.txt
[serveur~]# sed -n '1,17!p' 1.txt
& Sauvegarde la chaîne de recherche pour référence dans la chaîne de remplacement \(\)
[serveur~]# sed -n '/administrateur/p' donnees.txt
administrateur:x:0:0:administrateur:/root:/bin/bash
[serveur~]# sed -n 's/administrateur/#&/p' donnees.txt
#administrateur:x:0:0:administrateur:/root:/bin/bash
# sed -n 's/^administrateur/#&/p' passwd Commente les lignes commençant par administrateur
# sed -n -r 's/^administrateur|^eleve/#&/p' /etc/passwd Commente les lignes commençant par administrateur ou par eleve
# sed -n '1,5s/^[a-z].*/#&/p' passwd Commente les lignes 1~5 commençant par n'importe quelle lettre minuscule
# sed -n '1,5s/^/#/p' /etc/passwd Commente les lignes 1~5
Ou
sed -n '1,5s/^/#/p' passwd Ajoute # devant les lignes commençant par un espace
sed -n '1,5s/^#//p' passwd Remplace # par vide au début des lignes
[serveur~]# sed -n '/^administrateur/p' 1.txt
[serveur~]# sed -n 's/^administrateur/#&/p' 1.txt
[serveur~]# sed -n 's/\(^administrateur\)/#\1/p' 1.txt
[serveur~]# sed -nr '/^administrateur|^eleve/p' 1.txt
[serveur~]# sed -nr 's/^administrateur|^eleve/#&/p' 1.txt
= Affiche le numéro de ligne
# sed -n '/bash$/=' passwd Affiche le numéro de ligne se terminant par bash
# sed -ne '/administrateur/=' -ne '/administrateur/p' passwd
# sed -n '/nologin$/=;/nologin$/p' 1.txt
# sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt
q Quitter
# sed '5q' 1.txt
# sed '/mail/q' 1.txt
# sed -r '/^admin|^mail/q' 1.txt
[serveur~]# sed -n '/bash$/p;10q' 1.txt
ADMINISTRATEUR:x:0:0:administrateur:/root:/bin/bash
Utilisation combinée :
[serveur~]# sed -n '1,5s/^/#&/p' 1.txt
#administrateur:x:0:0:administrateur:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[serveur~]# sed -n '1,5s/\(^\)/#\1/p' 1.txt
#administrateur:x:0:0:administrateur:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4.Autres options
-e Édition multiple
-r Expressions régulières étendues
-i Modification du fichier original
[serveur~]# sed -ne '/administrateur/p' 1.txt -ne '/administrateur/='
administrateur:x:0:0:administrateur:/root:/bin/bash
1
[serveur~]# sed -ne '/administrateur/=' -ne '/administrateur/p' 1.txt
1
administrateur:x:0:0:administrateur:/root:/bin/bash
Insère "hello world" avant la ligne 5 dans le fichier 1.txt ; insère "hahaha" sous la ligne 8 dans le fichier 1.txt
[serveur~]# sed -e '5ihello world' -e '8ahahaha' 1.txt -e '5=;8='
sed -n '1,5p' 1.txt
sed -ne '1p' -ne '5p' 1.txt
sed -ne '1p;5p' 1.txt
Filtrage des lignes commençant par # et les lignes vides dans vsftpd.conf :
[serveur~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
[serveur~]# sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf
[serveur~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
[serveur~]# sed -r '/^#|^$/d' /etc/vsftpd/vsftpd.conf
Filtrage des lignes actives dans smb.conf :
# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/' smb.conf
# sed -r '/^(#|$|;|\t#|\t$)/d' smb.conf
# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/' smb.conf
[serveur~]# grep '^[^a-z]' 1.txt
[serveur~]# sed -n '/^[^a-z]/p' 1.txt
Extraction des adresses IP du fichier :
[serveur~]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt
192.168.0.254
[serveur~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt
192.168.0.254
[serveur~]# grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 2.txt
10.1.1.1
10.1.1.255
255.255.255.0
[serveur~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 2.txt
10.1.1.1
10.1.1.255
255.255.255.0
Extraction de l'IP, masque de sous-réseau et adresse de diffusion du fichier ifcfg-eth0
[serveur shell06]# grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0
10.1.1.1
255.255.255.0
10.1.1.254
[serveur shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|cut -d'=' -f2
10.1.1.1
255.255.255.0
10.1.1.254
[serveur shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|sed -n 's/[A-Z=]//gp'
10.1.1.1
255.255.255.0
10.1.1.254
[serveur shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/[:a-Z]//gp'|sed -n 's/ /\n/gp'|sed '/^$/d'
10.1.1.1
10.1.1.255
255.255.255.0
[serveur shell06]# ifconfig | sed -nr '/([0-9]{1,3}\.)[0-9]{1,3}/p' | head -1|sed -r 's/([a-z:]|[A-Z/t])//g'|sed 's/ /\n/g'|sed '/^$/d'
[serveur shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/p'
10.1.1.1
10.1.1.255
255.255.255.0
-i option Modification directe du fichier original
# sed -i 's/administrateur/ADMINISTRATEUR/;s/eleve/ELEVE/' 11.txt
# sed -i '17{s/ADMIN/administrateur/;s#/bin/bash#/sbin/nologin#}' 1.txt
# sed -i '1,5s/^/#&/' donnees.txt
Remarque :
-ni Ne les utilisez pas ensemble
p command Ne l'utilisez pas avec -i
5.Sed avec expressions régulières
sed options 'commande sed ou expression régulière ou localisation d'adresse=='== nom_fichier
1.L'adressage détermine quelles lignes éditer. L'adresse peut être un numéro, une expression régulière, ou une combinaison des deux.
2.Si aucune adresse n'est spécifiée, sed traitera toutes les lignes du fichier d'entrée.
x Spécifie le numéro de ligne x sed -n '5p' 1.txt
x,y Spécifie les lignes de x à y sed -n '1,5p' 1.txt
/motif Recherche les lignes contenant le mot clé sed -n '/administrateur/p' 1.txt
/motif1/,/motif2/ Correspond aux lignes entre deux mots clés sed -n '/^adm/,/^mysql/p' 1.txt
/motif/,x De la ligne correspondant au mot clé jusqu'à la ligne x (incluant la ligne du mot clé) sed -n '/^lp/,7p'
x,/motif/ De la ligne x jusqu'à la ligne correspondant au mot clé
x,y! Exclut les lignes de x à y
Par exemple :
[serveur~]# sed -n '/bash$/!p' 1.txt
Remarque : les expressions régulières utilisées par sed sont des motifs entourés de barres obliques "/" .
//La commande suivante trouve les lignes commençant par lp ou par mail
Autres commandes
y commande
Cette commande est similaire à la commande tr d'UNIX/Linux, les caractères sont convertis un-à-un de gauche à droite.
Les métacaractères d'expression régulière n'ont aucun effet sur la commande y. Comme le séparateur de commande s, la barre oblique peut être remplacée par d'autres caractères.
s/xxx/xxx/
y/xxx/xxx/
# sed '39,41y/eleve/ELEVE/' /etc/passwd
# sed '39,41y/eleve:x/ELEVE@%/' /etc/passwd
q Quitter
# sed '5q' 1.txt
# sed '/mail/q' 1.txt
# sed -r '/^admin|^mail/q' 1.txt
[serveur~]# sed -n '/bash$/p;10q' 1.txt
ADMINISTRATEUR:x:0:0:administrateur:/root:/bin/bash
- Format de Script
1.Utilisation
# sed -f scripts.sh fichier //Utilise un script pour traiter le fichier
Recommandé d'utiliser ./sed.sh fichier
La première ligne du script doit contenir
#!/bin/sed -f
1,5d
s/administrateur/bonjour/g
3i777
5i888
a999
p
2.Remarques
1) Le fichier de script est une liste de commandes sed. 'commandes'
2) À la fin de chaque ligne, il ne doit y avoir aucun espace, tabulation (tab) ou autre texte.
3) S'il y a plusieurs commandes dans une ligne, elles doivent être séparées par des points-virgules.
4) Les guillemets ne sont pas nécessaires et ne peuvent pas être utilisés pour protéger les commandes
5) Les lignes commençant par # sont des commentaires
3.Exemples
# cat passwd
eleve3:x:509:512::/home/user3:/bin/bash
eleve4:x:510:513::/home/user4:/bin/bash
eleve5:x:511:514::/home/user5:/bin/bash
# cat sed.sh
#!/bin/sed -f
2a\
******************
2,$s/eleve/utilisateur/
$a\
nous insérons une nouvelle ligne
s/^[a-z].*/#&/
[serveur~]# cat 1.sed
#!/bin/sed -f
3a**********************
$cbonjour le monde
1,3s/^/#&/
[serveur~]# sed -f 1.sed -i 11.txt
[serveur~]# cat 11.txt
#administrateur:x:0:0:administrateur:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
**********************
adm:x:3:4:adm:/var/adm:/sbin/nologin
bonjour le monde
- Résumé et Extensions
1、Les expressions régulières doivent être entourées de "/" avant et après
Par exemple : sed '/administrateur/d' fichier
Par exemple : sed '/^administrateur/d' fichier
2、Si la correspondance utilise des expressions régulières étendues, l'option -r doit être utilisée pour étendre sed
grep -E
sed -r
+ ? () {n,m} | \d
Remarque :
Dans les expressions régulières, si des caractères spéciaux apparaissent (^$.*/[]), ils doivent être échappés avec "\" précédent
eg:sed '/\$foo/p' fichier
3、Séparateur par virgule
Par exemple : sed '5,7d' fichier Supprime les lignes 5 à 7
Par exemple : sed '/administrateur/,/ftp/d' fichier
Supprime toutes les lignes de la première correspondance "administrateur" à la première correspondance "ftp", cette ligne non recherchée, exécution en boucle
4、Combinaison
Par exemple : sed '1,/foo/d' fichier Supprime du début jusqu'à la première correspondance "foo"
Par exemple : sed '/foo/,+4d' fichier Supprime de la correspondance "foo" jusqu'à 4 lignes après
Par exemple : sed '/foo/,~3d' fichier Supprime de la correspondance "foo" jusqu'à la ligne multiple de 3 (dans le fichier)
Par exemple : sed '1~5d' fichier À partir de la ligne 1, supprime une ligne toutes les 5 lignes
Par exemple : sed -nr '/foo|bar/p' fichier Affiche les lignes avec la configuration "foo" ou "bar"
Par exemple : sed -n '/foo/,/bar/p' fichier Affiche les lignes correspondant de foo à bar
Par exemple : sed '1~2d' fichier Supprime les lignes impaires
Par exemple : sed '0-2d' fichier Supprime les lignes paires sed '1~2!d' fichier
5、Cas particuliers
Par exemple : sed '$d' fichier Supprime la dernière ligne
Par exemple : sed '1d' fichier Supprime la première ligne
6、Autres :
sed 's/.//' donnees.txt Supprime le premier caractère de chaque ligne
sed 's/.//2' donnees.txt Supprime le deuxième caractère de chaque ligne
sed 's/.//N' donnees.txt À partir de la ligne N du fichier, supprime le Nième caractère de chaque ligne (N>2)
sed 's/.$//' donnees.txt Supprime le dernier caractère de chaque ligne
[serveur~]# cat 2.txt
1 a
2 b
3 c
4 d
5 e
6 f
7 u
8 k
9 o
[serveur~]# sed '/c/,~2d' 2.txt
1 a
2 b
5 e
6 f
7 u
8 k
9 o
- Exercices
Exercice 1 :
Remplacer n'importe quel chiffre par un espace ou une tabulation
Supprimer les chiffres, deux-points et barres obliques des lignes 1-5 d'un fichier
Rechercher le mot clé administrateur et le remplacer par hello formation, et enregistrer dans le fichier test.txt
Supprimer toutes les lignes commentées et les lignes vides des fichiers de configuration vsftpd.conf, smb.conf, main.cf (ne pas modifier directement le fichier original)
Utiliser la commande sed pour extraire votre propre adresse IP
Utiliser la commande sed pour extraire en une seule fois l'adresse IP, l'adresse de diffusion et le masque de sous-réseau
Commenter les lignes 2-3 et les lignes correspondant à celles commençant par administrateur ou par ftp
Réponses :
1、Remplacer les chiffres du fichier par un espace ou une tabulation
2、Supprimer les chiffres, deux-points et barres obliques des lignes 1-5 d'un fichier
3、Remplacer les lignes contenant le mot clé administrateur par hello formation, et enregistrer dans le fichier test.txt
4、Supprimer toutes les lignes commentées et les lignes vides des fichiers de configuration vsftpd.conf, smb.conf, main.cf (ne pas modifier directement le fichier original)
5、Utiliser la commande sed pour extraire sa propre adresse IP
# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr://pg'|sed -n 's/Bcast.*//gp'
10.1.1.1
# ifconfig eth0|sed -n '2p'|sed 's/.*addr://g'|sed 's/ Bcast:.*//g'
6、Utiliser la commande sed pour extraire en une seule fois l'adresse IP, l'adresse de diffusion et le masque de sous-réseau
# ifconfig eth0|sed -n '2p'|sed -n 's#.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)#\1\n\2\n\3#p'
10.1.1.1
10.1.1.255
255.255.255.0
7、Commenter les lignes 2-3 et les lignes correspondant à celles commençant par administrateur ou par ftp
# sed -nr '2,3s/^/#&/p;s/^ADMIN|^ftp/#&/p' 1.txt
#ADMIN:x:0:0:administrateur:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#3daemon:x:2:2:daemon:/sbin:/sbin/nologin
# sed -ne '1,2s/^/#&/gp' donnees.txt -nre 's/^lp|^mail/#&/gp'
# sed -nr '1,2s/^/#&/gp;s/^lp|^mail/#&/gp' donnees.txt
- Projet Post-Cours
1、Écrire un script d'initialisation système 1) Modifier automatiquement le nom d'hôte (si l'IP est 192.168.0.88, alors le nom d'hôte devient serveur88.formation.cc)
a. Modifier le fichier de manière non interactive sed
/etc/sysconfig/network
b. Extraire l'IP de ce hôte et l'assigner à une variable ip; puis assigner le dernier chiffre de la variable ip (séparé par .) à une autre variable ip1
2)Configurer automatiquement une source yum disponible
3)Désactiver automatiquement le pare-feu et selinux
2、Écrire un script pour mettre en place un service ftp, avec les exigences suivantes : 1) Les utilisateurs locaux ne peuvent pas se connecter local_enable=NON 2) Les utilisateurs anonymes peuvent télécharger, créer et supprimer anon_upload_enable=OUI anon_mkdir_write_enable=OUI 3) Les utilisateurs anonymes sont limités à 500KBps anon_max_rate=500000
À titre de référence :
#!/bin/bash
ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`
iptail=`echo $ipaddr|cut -d'.' -f4`
ipremote=192.168.1.10
#Modifier le nom d'hôte
hostname serveur$iptail.formation.com
sed -i "/HOSTNAME/cHOSTNAME=serveur$iptail.formation.com" /etc/sysconfig/network
echo "$ipaddr serveur$iptail.formation.cc" >>/etc/hosts
#Désactiver le pare-feu et selinux
service iptables stop
setenforce 0 >/dev/null 2>&1
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
#Configurer la source yum (généralement une source interne)
#test réseau
ping -c 1 $ipremote > /dev/null 2>&1
if [ $? -ne 0 ];then
echo "Votre réseau n'est pas connecté, veuillez vérifier votre réseau"
exit 1
else
echo "Réseau ok."
fi
cat > /etc/yum.repos.d/server.repo << end
[server]
name=server
baseurl=ftp://$ipremote
enabled=1
gpgcheck=0
end
#Installer des logiciels
read -p "Veuillez saisir les logiciels à installer, séparés par des espaces :" soft
yum -y install $soft &>/dev/null
#Sauvegarder le fichier de configuration
conf=/etc/vsftpd/vsftpd.conf
\cp $conf $conf.default
#Modifier le fichier de configuration selon les besoins
sed -ir '/^#|^$/d' $conf
sed -i '/local_enable/c\local_enable=NON' $conf
sed -i '$a anon_upload_enable=OUI' $conf
sed -i '$a anon_mkdir_write_enable=OUI' $conf
sed -i '$a anon_other_write_enable=OUI' $conf
sed -i '$a anon_max_rate=512000' $conf
#Démarrer le service
service vsftpd restart &>/dev/null && echo"Le service vsftpd a démarré avec succès"
#Test et vérification
chmod 777 /var/ftp/pub
cp /etc/hosts /var/ftp/pub
#Test de téléchargement
cd /tmp
lftp $ipaddr <<end
cd pub
get hosts
exit
end
if [ -f /tmp/hosts ];then
echo "Téléchargement anonyme réussi"
rm -f /tmp/hosts
else
echo "Échec du téléchargement anonyme"
fi
#Test de téléversement, création de répertoires, suppression de répertoires, etc.
cd /tmp
lftp $ipaddr << end
cd pub
mkdir test1
mkdir test2
put /etc/group
rmdir test2
exit
end
if [ -d /var/ftp/pub/test1 ];then
echo "Création de répertoire réussie"
if [ ! -d /var/ftp/pub/test2 ];then
echo "Suppression de répertoire réussie"
fi
else
if [ -f /var/ftp/pub/group ];then
echo "Téléversement de fichier réussi"
else
echo "Téléversement, création et suppression de répertoires pas ok"
fi
fi
[ -f /var/ftp/pub/group ] && echo "Téléversement de fichier réussi"
Exercices
1,Supprimer le premier caractère de chaque ligne du fichier.
sed -n 's/^.//gp' /etc/passwd
sed -nr 's/(.)(.*)/\2/p' /etc/passwd
2,Supprimer le deuxième caractère de chaque ligne du fichier.
sed -nr 's/(.)(.)(.*)/\1\3/p' /etc/passwd
3,Supprimer le dernier caractère de chaque ligne du fichier.
sed -nr 's/.$//p' /etc/passwd
sed -nr 's/(.*)(.)/\1/p' /etc/passwd
4,Supprimer l'avant-dernier caractère de chaque ligne du fichier.
sed -nr 's/(.*)(.)(.)/\1\3/p' /etc/passwd
5,Supprimer le deuxième mot de chaque ligne du fichier.
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\2\3\5/p' /etc/passwd
6,Supprimer l'avant-dernier mot de chaque ligne du fichier.
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4\5\6/p' /etc/samba/smb.conf
7,Supprimer le dernier mot de chaque ligne du fichier.
sed -nr 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/\1\2\4/p' /etc/samba/smb.conf
8,Échanger le premier et le deuxième caractère de chaque ligne.
sed -nr 's/(.)(.)(.*)/\2\1\3/p' /etc/passwd
9,Échanger le premier et le deuxième mot de chaque ligne.
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/samba/smb.conf
10,Échanger le premier et le dernier mot de chaque ligne.
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\1\4\3\2\5/p' /etc/passwd
11,Supprimer tous les chiffres d'un fichier.
sed 's/[0-9]*//g' /etc/passwd
12,Supprimer tous les espaces au début de chaque ligne.
sed -n 's/^\ *//p' /etc/samba/smb.conf
sed -nr 's/( *)(.*)/\2/p' testp
13,Remplacer tous les espaces du fichier par des tabulations.
sed -n 's/\ /\t/gp' pass
14,Mettre toutes les lettres majuscules entre parenthèses ().
sed -nr 's/([A-Z])/(&)/gp' testp
sed -n 's/[A-Z]/(&)/gp' testp
15,Imprimer chaque ligne 3 fois.
sed 'p;p' pass
16,Supprimer toutes les lignes impaires.
sed -n '1~2p' pass
17,Copier les lignes 22 à 33 du fichier après la ligne 44.
sed '1,21h;22h;23,33H;44G' pass
18,Déplacer les lignes 22 à 33 du fichier après la ligne 44.
sed '22{h;d};23,33{H;d};44G' pass
19,Afficher uniquement le premier mot de chaque ligne.
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)/\2/p' /etc/passwd
20,Imprimer le premier et le troisième mot de chaque ligne.
sed -nr 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/\2--\4/p' /etc/passwd
21,Convertir le format de date mm/yy/dd en mm;yy;dd.
date +%m/%Y/%d |sed -n 's#/#;#gp'
Exercices sed :
1、Supprimer les espaces au début des lignes du fichier /etc/grub.conf ;
sed -r 's@^[[:space:]]+@@g' /etc/grub.conf
2、Remplacer le chiffre dans la ligne "id:3:initdefault:" du fichier /etc/inittab par 5 ;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、Supprimer les lignes vides du fichier /etc/inittab ;
sed '/^$/d' /etc/inittab
4、Supprimer les # au début des lignes du fichier /etc/inittab;
sed 's@^#@@g' /etc/inittab
5、Supprimer les # au début des lignes et les espaces suivants dans un fichier, mais en exigeant qu'il y ait des espaces après le #;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、Supprimer les espaces au début et les # des lignes commençant par des espaces suivis de # dans un fichier;
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7,Extraire le nom de répertoire d'un chemin de fichier ;
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
Nom de base :
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'
Référence :
https://www.cnblogs.com/ctaixw/p/5860221.html
https://www.cnblogs.com/wangcp-2014/p/6756377.html
http://events.jianshu.io/p/e8d8d52fd62c
L'éditeur de texte sed traite les fichiers (ou entrées) ligne par ligne et envoie les résultats vers l'écran. Les commandes sed sont celles que l'on retrouve dans les éditeurs vi et ed/ex. sed stocke la ligne actuellement traitée dans une zone tampon temporaire, appelée espace de motif ou tampon temporaire. Après avoir traité la ligne dans l'espace de motif (c'est-à-dire après avoir exécuté la commande sed sur cette ligne), sed envoie la ligne vers l'écran (sauf si une commande précédente a supprimé cette ligne ou annulé l'impression). Une fois la dernière ligne du fichier d'entrée traitée, sed termine son exécution. Comme sed travaille sur une copie de chaque ligne dans la zone tampon, il ne modifie ni ne détruit le fichier source.