IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Insert if pattern


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 53
    Par défaut Insert if pattern
    Bonjour,

    j'ai un fichier "monfichier" qui contient des blocs de lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    xx toto1
    yy toto2
     
    xx titi1
    yy titi2
     
    xx tutu1
    yy tutu2
     
    xx tata1
    J'ai besoin d'ajouter des lignes zz après chaque ligne yy , le reste de la ligne est identique à la précédente.

    A noter que je travaille sur AIX donc pas de sed -i.

    J'ai commencé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    grep yy monfichier >> resultat
    perl -pi -e 's/yy/zz/g' resultat
    et enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while read line
    do echo $line >> monfichier
    done < resultat
    Le résultat est + ou moins celui attendu car j'ai toutes mes lignes zz en fin de "monfichier" alors que je voudrais les insérer après chaque ligne xx pour que mon fichier soit plus propre et plus lisible.
    "monfichier" fait + ou - 500 blocs, je n'ai donc pas trop envie de le faire à la main. Comme il s'agit d'un fichier qui est utilisé en paramètre d'un batch, mes commandes ci-dessus font le job mais ça manque de maîtrise et mon fichier n'est pas "carré"

    Je suis convaincu qu'un petit sed ou awk en une ligne doit être capable de faire ça.

    Merci

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je me mouille pas trop avec les différentes versions de sed/awk étant abonné Linux, mais Perl reste Perl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ perl -lne 'print; print $_ if s/^yy/zz/' fichier
    xx toto1
    yy toto2
    zz toto2
     
    xx titi1
    yy titi2
    zz titi2
     
    xx tutu1
    yy tutu2
    zz tutu2
     
    xx tata1

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 352
    Par défaut
    Bonjour,
    Une méthode pour remplacer le sed -i (Fait des tests pour maitriser le système car on efface le fichier que l'on modifie ici) :
    Le fichier à modifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat /tmp/xx1.tt 
    xx toto1
    yy toto2
     
    xx titi1
    yy titi2
     
    xx tutu1
    yy tutu2
     
    xx tata1
    les actions de modifications (Les commandes sont bien dans le bon ordre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ exec 3</tmp/xx1.tt 
    $ rm /tmp/xx1.tt 
    $ sed -n -e 'p' -e 's/^yy/zz/' -e '/^zz/p' <&3 >/tmp/xx1.tt
    Le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat /tmp/xx1.tt 
    xx toto1
    yy toto2
    zz toto2
     
    xx titi1
    yy titi2
    zz titi2
     
    xx tutu1
    yy tutu2
    zz tutu2
     
    xx tata1

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 53
    Par défaut
    Bonjour,

    Merci à vous,
    j'ai testé la solution de BufferBob qui fait le job parfaitement,
    en ce qui concerne celle de DISEDORGUE, tout est OK aussi mais j'avoue que j'aime moins les rm de fichiers.

    Bonne année à vous .

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par barbican82 Voir le message
    en ce qui concerne celle de DISEDORGUE, tout est OK aussi mais j'avoue que j'aime moins les rm de fichiers.
    en fait qu'on utilise perl -i, sed -i ou la solution de disedorgue il y a toujours un fichier temporaire, et donc un rm dans la foulée, la seule différence c'est que dans la dernière solution l'opération est explicite

    on ne peut pas techniquement faire de l'édition "inplace" réelle, ou pour être plus exact, on ne peut pas faire de délétion ou d'insertion dans un fichier directement, dans le meilleur des cas on peut juste modifier remplacer quelques octets comme on le fait avec un éditeur hexadécimal par exemple

    Edit: par contre on pouvait peut-être raccourcir avec sed -e '/^yy/{p;s/^yy/zz/}' ?

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 352
    Par défaut
    Il y a tout de même une petite différence entre la méthode que je propose via le rm et le cas des inplace de sed ou perl: dans le cas d'un plantage pour une raison ou une autre, on peut dans certaines circonstances, récupérer le fichier initial pour les inplace, tandis que dans la méthode rm, c'est du tout ou rien.
    @Bufferbob: le sed aix supporte peut-être cette syntaxe (séparation par ; ), par contre, pour être plus portable, il manque un ; avant } (certains sed sont intransigeant la-dessus).
    Mais +1 pour ta version qui corrige une restriction dans la mienne ( si dans le fichier, il y a le pattern '^zz' alors il affichera 2 fois la ligne ).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] regex : exploiter plusieurs pattern pour insert en BDD
    Par kairi084 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 05/11/2010, 21h46
  2. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 09h28
  3. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  4. [Postgresql] pb lors d'insertion de données
    Par bob20000 dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/11/2002, 15h33
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo