Forum Programmation.perl [regex] rajouter du texte avant une liste

Posté par  (site web personnel) .
Étiquettes : aucune
0
29
oct.
2012

bonjour,

je cherche à modifier dans un fichier texte toutes les lignes (vide) qui précèdent une suite de choix débutant par un "-", avec le rajout d'une ligne contenant toujours la même constante.

Par exemple :

blabla.
blabla.

- choix 1
- choix 2
- choix 3

blabla.

- nouveau choix 1
- etc

deviendrait :

blabla.
blabla.

constante
- choix 1
- choix 2
- choix 3

blabla.

constante
- nouveau choix 1
- etc 

J'ai essayé avec

perl -pe 's/^$^- /constante\n - /'
perl -pe 's/\n^- /constante\n - /'

mais ça serait trop simple…

Ça peut être en perl, awk, sed, je veux juste rajouter une ligne avant chaque début de liste…

  • # bidouille…

    Posté par  (site web personnel, Mastodon) . Évalué à 2.

    Si tu remplaces les lignes vides par un mot clé (en virant le retour à la ligne après) tu te retrouves avec des sautdelignesautdeligne- choix 1[…]

    après tu remplaces sautdeligne- par constante\r-

    et enfin sautdeligne par \r

    mais c'est grave de la bidouille et je vais suivre si il y a une solution simple

    • [^] # Re: bidouille…

      Posté par  (site web personnel) . Évalué à 1. Dernière modification le 29 octobre 2012 à 14:15.

      j'y ai pensé, mais le problème c'est que je ne veux rajouter la constante qu'avant chaque début de liste, mais pas pour toutes les lignes vides (car il y en a ailleurs)

      « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

      • [^] # Re: bidouille…

        Posté par  (site web personnel) . Évalué à 2.

        Avec perl tu peux faire:

        perl -e 'local $/;$_ = <>; s/\n *\n-/\n\nconstante\n-/g; print;' fichier
        
        

        Au lieu de lire ligne à ligne, tu lis tout le fichier d'un coup.

      • [^] # Re: bidouille…

        Posté par  (site web personnel) . Évalué à 2.

        je raconte n'importe quoi, tu as raison Matthieu, ça fonctionne en faisant comme tu dis, par exemple :

        perl -pe  's/\n/sautdeligne/g' | perl -pe 's/sautdelignesautdeligne- /\n\nconstante\n- /g' | perl -pe 's/sautdeligne/\n/g' 
        
        

        Du coup c'est moins propre que les autres exemples donnés plus bas (que je remercie au passage), mais comme je suis déjà parti là dedans, je vais garder cette solution pour le moment.

        « I approve of any development that makes it more difficult for governments and criminals to monopolize the use of force. » Eric Raymond

  • # Avec sed...

    Posté par  . Évalué à 2. Dernière modification le 29 octobre 2012 à 15:11.

    Salut,

    Avec sed :

    $ cat plop 
    blabla.
    blabla.
    
    - choix 1
    - choix 2
    - choix 3
    
    blabla.
    
    - nouveau choix 1
    - etc
    
    
    $ sed '/^$/{N;/\n-/{s/-/constante\n&/}}' plop
    blabla.
    blabla.
    
    constante
    - choix 1
    - choix 2
    - choix 3
    
    blabla.
    
    constante
    - nouveau choix 1
    - etc
    
    $
    
    

Suivre le flux des commentaires

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