GNU/Linux >> Tutoriels Linux >  >> Linux

Tutoriel Unix Sed :7 exemples d'opérations Sed Hold et Pattern Buffer

Cet article fait partie de la série en cours Unix Sed Tips and Tricks.

Dans nos précédents articles sur sed, nous avons appris — l'impression sed, la suppression sed, le substitut sed, l'écriture de fichier sed, les commandes multiples sed, l'opération multiligne sed et la manipulation de lignes de fichier sed.

Dans notre première partie du tutoriel sed, nous avons appris que sed a deux tampons — sed pattern buffer et tampon de maintien sed . Jusqu'à présent, nous n'avons parlé que du tampon de modèle.

Dans cet article, voyons comment utiliser sed hold et pattern buffer en utilisant 7 exemples pratiques de sed .

Comme son nom l'indique, sed hold buffer est utilisé pour enregistrer tout ou partie de l'espace de motif sed pour une récupération ultérieure. Le contenu de l'espace de motif peut être copié dans l'espace de maintien, puis à nouveau. Aucune opération n'est effectuée directement sur l'espace d'attente. sed fournit un ensemble de fonctions hold et get pour gérer ces mouvements.

Fonction Sed h

La fonction h (hold) copie le contenu de l'espace de motif dans une zone de maintien (également appelée espace de maintien sed ), détruisant tout contenu précédent de la zone d'attente.

Fonction Sed H

La fonction H ajoute le contenu de l'espace de motif au contenu de la zone de maintien. L'ancien et le nouveau contenu sont séparés par une nouvelle ligne.

Fonction Sed g

La fonction g copie le contenu de la zone de maintien dans l'espace du motif, détruisant le contenu précédent de l'espace du motif.

Fonction Sed G

La fonction G ajoute le contenu de la zone de maintien au contenu de l'espace du motif. L'ancien et le nouveau contenu sont séparés par une nouvelle ligne. Le nombre maximum d'adresses est de deux.

Fonction Sed x

La fonction d'échange échange le contenu de l'espace de motif et de la zone d'attente. Le nombre maximum d'adresses est de deux.

Voyons maintenant quelques exemples pour en savoir plus sur les commandes ci-dessus.

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
        Mysql
        Oracle
        Queries
        Procedures

1. Double espacer le contenu d'un fichier à l'aide de la commande Sed

$sed 'G' thegeekstuff.txt
#Linux

        Administration

        Scripting

        Tips and Tricks

#Windows

        Administration

#Database

        Mysql

        Oracle

        Queries

        Procedures 

$

Dans cet exemple,

  1. Sed lit une ligne et la place dans le tampon de modèle.
  2. La commande G ajoute le tampon de maintien au tampon de modèle séparé par \n. donc une nouvelle ligne sera ajoutée avec le contenu de l'espace de modèle.
  3. De même, si vous souhaitez tripler l'espacement d'un fichier, ajoutez deux fois le contenu du tampon de maintien au tampon de modèle. (G;G)

2. Imprimer le contenu du fichier dans l'ordre inverse à l'aide de la commande Sed

Imprimer les lignes d'un fichier dans l'ordre inverse (similaire à la commande tac dont nous avons parlé plus tôt).

$sed -n '1!G;h;$p' thegeekstuff.txt
        Procedures
        Queries
        Oracle
        Mysql
#Database

        Administration
#Windows

        Tips and Tricks
        Scripting
        Administration
#Linux

Dans cet exemple,

  1. La première ligne sera placée telle quelle dans l'espace réservé.
  2. À partir de la 2ème ligne, ajoutez simplement le contenu de l'espace de maintien avec l'espace de modèle. (N'oubliez pas que la 2ème ligne est dans l'espace du motif et que la 1ère ligne est dans l'espace de maintien).
  3. Maintenant, la 1ère et la 2ème ligne ont été inversées et déplacez-les vers l'espace de maintien.
  4. Répétez les étapes ci-dessus jusqu'à la dernière ligne.
  5. Une fois la dernière ligne atteinte, ajoutez simplement le contenu de l'espace de maintien avec l'espace du modèle et imprimez l'espace du modèle.

3. Imprimer un paragraphe (uniquement s'il contient un motif donné) à l'aide de la commande Sed

Dans le paragraphe geekstuff.txt imprimer uniquement s'il contient le modèle "Administration".

$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt 

Linux
        Administration
        Scripting
        Tips and Tricks

Windows
        Administration

Dans cet exemple,

  1. Jusqu'à ce que la ligne vide arrive, continuez à ajouter les lignes non vides dans l'espace de maintien
  2. Lorsque la ligne vide arrive, c'est-à-dire la fin du paragraphe, échangez les données entre le motif et l'espace de maintien. Ainsi, tout ce paragraphe sera disponible dans l'espace du modèle.
    Vérifiez si le modèle "Administration" est disponible, si oui, ne le supprimez pas, c'est-à-dire imprimez l'espace du modèle

4. Imprimer la ligne juste avant une correspondance de modèle à l'aide de la commande Sed

N'imprimez que la ligne qui précède immédiatement le motif "Mysql".

$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt
#Database

Dans cet exemple,

  1. Pour chaque cycle, placez la ligne dans le tampon de maintien, si elle ne correspond pas au modèle "Mysql".
  2. Si la ligne correspond au modèle, récupérez les données de l'espace de maintien (ligne précédente) à l'aide de la commande g et imprimez-les.
  3. Dans le cas où la première ligne correspond au motif "Mysql", de toute façon l'espace de maintien sera vide. (Il n'y a pas de ligne précédente à la première ligne). La première ligne ne doit donc pas être imprimée (1! p)

5. Supprimez la dernière ligne de chaque paragraphe à l'aide de la commande Sed

$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt 

#Linux
        Administration
        Scripting

#Windows

#Database
        Mysql
        Oracle
        Queries

Dans cet exemple,

  1. Si la ligne n'est pas vide, échangez la ligne entre le motif et l'espace de maintien. Ainsi, la première ligne sera placée dans l'espace réservé.
  2. Lorsque la prochaine ligne non vide arrive, échangez l'espace de motif et l'espace de maintien, et imprimez l'espace de motif. c'est-à-dire que la première ligne non vide sera imprimée et la 2ème ligne sera mise en attente. Et dans le cycle suivant, la 2ème ligne non vide est imprimée lorsque la 3ème ligne est mise en attente et continue ainsi.
  3. Lorsque la ligne vide arrive (la ligne précédente à la ligne vide sera disponible dans le tampon de maintien), échangez simplement le motif et maintenez l'espace, puis supprimez la ligne (dernière ligne du paragraphe) et démarrez le cycle suivant.

6. Pour chaque ligne, ajoutez la ligne précédente à la fin de celle-ci à l'aide de la commande Sed

$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt
#Linux
        Administration#Linux
        Scripting        Administration
        Tips and Tricks        Scripting
        Tips and Tricks
#Windows
        Administration#Windows
        Administration
#Database
        Mysql#Database
        Oracle        Mysql
        Queries Oracle
        Procedures                      Queries

Dans cet exemple,

  1. Placez la première ligne dans le tampon Hold.
  2. Lorsque la deuxième ligne arrive, ajoutez à Hold space (première ligne)
  3. Ensuite, échangez le motif et maintenez le tampon. Alors maintenant, l'espace de modèle aura une première et une deuxième ligne séparées par \n, l'espace de maintien n'aura qu'une deuxième ligne.
  4. Intervertissez donc les lignes dans l'espace du motif.
  5. Les étapes ci-dessus se déroulent jusqu'à la fin du fichier

7. Ajouter la balise de chaque bloc à chaque ligne de ce bloc

$ sed '
/^#/{
h
d
}
G
s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt
Linux         Administration
Linux         Scripting
Linux         Tips and Tricks
Linux
Windows         Administration
Windows
Database         Mysql
Database        Oracle
Database        Queries
Database        Procedures

Dans cet exemple,

  1. Lorsque la première ligne d'un bloc est remplie (commençant par #)
    • gardez cette ligne dans l'espace de maintien via la commande `h'
    • Puis supprimez en utilisant 'd' pour démarrer un autre cycle.
  2. Pour les lignes restantes d'un bloc, la commande "G" ajoute la ligne de balise à partir de l'espace de maintien et la commande de substitution échange correctement la balise et les lignes.

Linux
  1. Bash For Loop Guide et exemples

  2. Tutoriel Linux ln Command pour débutants (5 exemples)

  3. Tutoriel de commande Linux nl pour les débutants (7 exemples)

  4. Exemples de boucle Bash For et de boucle While

  5. Le concept de 'Hold space' et 'Pattern space' dans sed

Tutoriel Unix Sed :Impression de lignes de fichier à l'aide d'adresses et de modèles

Tutoriel Unix Sed :Supprimer des lignes de fichier à l'aide d'adresses et de modèles

Tutoriel Unix Sed :Exemples avancés de substitution Sed

Tutoriel Unix Sed :ajouter, insérer, remplacer et compter les lignes de fichiers

Tutoriel Unix Sed :6 exemples d'opération de branchement Sed

Tutoriel Unix Sed :Opération de fichiers multilignes avec 6 exemples pratiques