Cet article fait partie de la série en cours Unix Sed Tips and Tricks.
Comme tout autre langage de programmation, sed fournit également des commandes de branchement spéciales pour contrôler le flux du programme.
Dans cet article, passons en revue les deux types de branchement Sed suivants.
- Sed Branche inconditionnelle
- Branche conditionnelle Sed
Syntaxe de branche inconditionnelle Sed :
$ sed ':label command(s) b label'
- :étiquette – spécification de l'étiquette.
- commandes – Toute(s) commande(s) sed
- libellé :n'importe quel nom pour le libellé
- étiquette b – saute à l'étiquette sans vérifier aucune condition. Si l'étiquette n'est pas spécifiée, saute à la fin du script.
Syntaxe de branche conditionnelle Sed :
$ sed ':label command(s) t label'
- :étiquette – spécification de l'étiquette.
- commandes – Toute(s) commande(s) sed
- libellé :n'importe quel nom pour le libellé
- t étiquette – saute à l'étiquette uniquement si la dernière commande de substitution a modifié l'espace du motif. Si l'étiquette n'est pas spécifiée, saute à la fin du script.
Créer un exemple de fichier de test
Créons d'abord le fichier geekstuff.txt qui sera utilisé dans les exemples mentionnés ci-dessous.
$ cat thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc" $
Je. Exemples Sed pour une branche inconditionnelle
Sed Exemple 1. Remplacer la première occurrence d'un motif dans un fichier entier
Dans le fichier thegeekstuff.txt remplacez la première occurrence de "Administration" par "Supervision".
$ sed '/Administration/{ s/Administration/Supervision/ :loop n b loop }' thegeekstuff.txt Linux Supervision Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Dans la commande sed ci-dessus, il suffit de lire ligne par ligne et d'imprimer l'espace de modèle jusqu'à ce que l'administration se produise.
- Une fois que l'administration a eu lieu, remplacez l'administration par la supervision (une seule occurrence, notez qu'il n'y a pas de drapeau « g » en remplacement).
- Une fois la première occurrence remplacée, lisez simplement le contenu du fichier restant et imprimez.
- "n" est une commande sed qui imprime l'espace du motif et l'écrase avec la ligne suivante.
- A utilisé "boucle" comme étiquette. "n" imprime la ligne actuelle et écrase l'espace du motif avec la ligne suivante. La boucle b saute à nouveau à la boucle :. Cette boucle imprime donc le contenu restant de thegeekstuff.txt.
Sed Exemple 2. Supprimer les données entre le motif ” ” dans un fichier entier
Dans notre fichier d'exemple, il y a trois lignes entre "".
sed -e ':loop $!{ N /\n$/!b loop } s/\"[^\"]*\"//g' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online\ Security Productivity Google Search\ Tips $
- La commande ci-dessus keep ajoute toutes les lignes d'un fichier jusqu'à la fin du fichier.
- $ ! – Si ce n'est pas une fin de fichier.
- N - Ajouter la ligne suivante avec l'espace de modèle délimité par \n
- /\n$/!b loop – S'il ne s'agit pas de la dernière ligne du fichier, revenez à la boucle.
- Maintenant, toutes les lignes seront disponibles dans un espace de motif délimité par une nouvelle ligne. Remplacez toutes les occurrences de données entre ” par le vide.
Sed Exemple 3. Supprimer les balises HTML d'un fichier
Disons que j'ai un fichier avec le contenu html suivant
$ cat index.html <html><body> <table border=2><tr><td valign=top align=right>1.</td> <td>Line 1 Column 2</ td> </table> </body></html>
La commande sed suivante supprime toutes les balises html du fichier donné
$ sed '/</{ :loop s/<[^<]*>//g /</{ N b loop } }' index.html 1. Line 1 Column 2
- Chaque fois qu'une ligne contient '<', supprimez d'abord toutes les balises HTML de cette ligne.
- Si maintenant l'espace du motif contient '<', cela implique une balise multi-lignes. Répétez maintenant la boucle suivante :
- Rejoindre la ligne suivante
- Supprimez toutes les balises HTML jusqu'à ce qu'il n'y ait plus de « < » unique
- Lorsqu'aucun '<' n'existe dans l'espace du motif, nous l'imprimons et commençons un nouveau cycle.
II. Exemples Sed pour la branche conditionnelle
Sed Exemple 4. Si une ligne se termine par une barre oblique inverse, ajoutez-y la ligne suivante.
Notre fichier d'exemple a deux lignes terminées par une barre oblique inverse, nous devons maintenant y ajouter sa ligne suivante.
$ sed ' :loop /\\$/N s/\\\n */ / t loop' thegeekstuff.txt Linux Administration Scripting Tips and Tricks Windows Administration Database Administration of Oracle Administration of Mysql Security Network Online Security Productivity Google Search Tips "Web Based Time Tracking, Web Based Todo list and Reduce Key Stores etc"
- Vérifiez si la ligne se termine par la barre oblique inverse (/\\$/), si oui, lisez et ajoutez la ligne suivante à l'espace de modèle, et remplacez le \ à la fin de la ligne et le nombre d'espaces suivis de cela, avec l'espace unique.
- Si la substitution est réussie, répétez l'étape ci-dessus. La branche ne sera exécutée que si la substitution réussit.
- Branche conditionnelle principalement utilisée pour les modèles récursifs.
Sed Example 5. Commify une chaîne numérique.
sed ' :loop s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ t loop' 12342342342343434 12,342,342,342,343,434
- Regroupez les chiffres en deux groupes.
- Le premier groupe comprend tous les chiffres jusqu'aux trois derniers chiffres. Les trois derniers chiffres sont capturés dans le 2e groupe.
- Ensuite, les deux groupes correspondants sont séparés par une virgule. Ensuite, les mêmes règles sont appliquées à la ligne encore et encore jusqu'à ce que tous les nombres aient été regroupés par groupes de trois.
- Par exemple, dans la première itération, ce sera 12342342342343,434
- À l'itération suivante, 12342342342 343 434 et continue jusqu'à ce qu'il y ait moins de trois chiffres.
Sed Exemple 6. Formatage :Remplacez chaque espace de tête d'une ligne par "+"
$ sed ' s/^ */&\n/ :loop s/^\n//;s/ \n/\n+/ t loop' test Linux ++++++++Administration ++++++++Scripting ++++++++++++++++Tips and Tricks Windows ++++++++Administration Database ++++++++Administration of Oracle ++++++++Administration of Mysql Security ++++++++Network +++++++++++++++++Online\ ++++++++Security Productivity ++++++++Google Search\ ++++++++Tips ++++++++"Web Based Time Tracking, ++++++++Web Based Todo list and ++++++++Reduce Key Stores etc"
- Séparez tous les espaces de début et autres caractères d'une ligne par un caractère de saut de ligne.
- Remplacez maintenant l'espace et le retour à la ligne par un retour à la ligne et +. Ainsi, de droite à gauche, l'espace sera remplacé par + et la nouvelle ligne sera déplacée vers la gauche d'un caractère.
- Enfin au début de la ligne \n sera là, alors supprimez cette nouvelle ligne.