Forum Programmation.shell effacer un bloc qui contient un pattern

Posté par  .
Étiquettes : aucune
0
26
fév.
2007
Plop les moules et autres mollusques ...

Ca va faire quelque temps maintenant que je bloque sur un truc à priori simple.
J'aimerai effacer un bloc dans un fichier si ce bloc match un pattern.

Et comme un exemple vaut mieux qu'un long discours, voilà l'exemple du fichier avec les blocs :

define host {
hostname plop
blablabla
}

define service {
hostname plop
alias LALIAS
command cmd
blablabla blablabla
}

define service {
hostname plop
alias LALIAS2
command cmd2
blabalbla blablabla
}

Le but du jeu est, comme tout le monde l'aura compris, de supprimer un bloc service avec le pattern LALIAS2 sans toucher au reste du fichier évidemment :)
Le shell est ksh.

J'ai bien quelque baffouille en sed si des gens me demande, mais j'ai un peu honte de c'que j'ai pondu :s

Bon, si personne trouve, c'est pas grave, le stagiaire m'a pondu un truc en awk qui a l'air de marcher ; mais vu que j'suis faché avec awk et que je sais que de guru du shell me trouveront un truc elegant/beau (tout l'inverse de awk quoi), je préfère venir vous demander.

D'avance merci!

PS : un pertinentage à celui qui trouve à quel logiciel appartient ce genre de fichier de conf ...
  • # sed

    Posté par  . Évalué à 0.

    Et oui, j'ai retourner la doc de sed, et pas trouvé de solution simple (sans passer par un script sed).
  • # le logiciel qui a ce fichier de conf...

    Posté par  . Évalué à 0.

    on dirait du ORACLE.

    fichier TNSNAME.ora

    j'ai tout bon ?
  • # en sed...

    Posté par  . Évalué à 5.

    s'il n'y a pas de blocs imbriqués il suffit de charger le bloc dans le pattern space puis de matcher dessus, si ca match tu l'efface, par exemple:

    sed '/service[[:blank:]]\+{/{:load;N;s/}/}/;t blockend;b load;:blockend; /alias[[:blank:]]\+LALIAS2\n/d;}' < input > output
    • [^] # Re: en sed...

      Posté par  . Évalué à 1.

      Et en plus ça marche !

      c'est là que j'me sent tout petit et que je vois le chemin qu'y me reste à faire ...

      Me reste plusqu'à comprendre ce truc (surtout en les 2 regexp) et j'pourrais l'utiliser.

      Merci
  • # La cavalerie ...

    Posté par  . Évalué à 2.

    Bon, le temps de retrouvé ça :

    http://www.student.northpark.edu/pemente/sed/sedfaq4.html#s4(...)

    quelqu'un a donné la solution in extenso :)

    Jeqçaqm ;-)
  • # avec awk

    Posté par  . Évalué à 3.

    # cat test1
    define host {
    hostname plop
    blablabla
    }

    define service {
    hostname plop
    alias LALIAS
    command cmd
    blablabla blablabla
    }

    define service {
    hostname plop
    alias LALIAS2
    command cmd2
    blabalbla blablabla
    }

    awk 'BEGIN{RS="}"} /define/ && !/LALIAS2/ { print $0 "}" }' test1
    define host {
    hostname plop
    blablabla
    }


    define service {
    hostname plop
    alias LALIAS
    command cmd
    blablabla blablabla
    }

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.