Recherche/remplacement de texte sur plusieurs lignes

Bonjour à tous
Je me trouve confronté à un petit "problème" que je n'arrive pas à résoudre.
En effet, je suis en train de modifier certains fichiers d'un jeu, et pour ceci je dois remplacer certaines lignes dans des fichiers texte. Le problème, c'est que je ne vois pas comment faire pour automatiser un peu ce remplacement, car il y a plus de 30 000lignes de code, et ça commence à devenir très long ^^

Voila un exemple de ce que j'ai et de ce que je souhaiterais faire :

205509 = { 
 name="Pierre"  
        dynasty=743  
 religion="catholic" 
 culture="frankish" 
 father=205502  
 mother=213118 
 1126.1.1 = { 
  birth="1126.1.1" 
 } 
 1183.4.10 = { 
  death="1183.4.10" 
 } 
} 
205511 = { 
 name="Constance" 
 female=yes 
        dynasty=744 
 religion="catholic" 
 culture="frankish" 
 father=214 
 mother=106524 
 1078.1.1 = { 
  birth="1078.1.1" 
 } 
 1108.9.1 = { 
 give_job_title=title_regent 
 } 
 1119.1.1 = { 
 remove_title=title_regent 
 } 
 1126.7.14 = { 
  death="1126.7.14" 
 } 
} 

205512 = { 
 name="Marie" 
 female=yes 
        dynasty=743 
 religion="catholic" 
 culture="frankish" 
 father=205500 
 mother=205730 
 1145.1.1 = { 
  birth="1145.1.1" 
 } 
 1198.1.1 = { 
  death="1198.1.1" 
 } 
}


J'aimerais remplacer la ligne culture="frankish" par culture="XXX" selon le numéro contenu sur la ligne dynasty=YYY
En clair, j'aimerais que pour tous les personnage de la dynatie 743 on remplace la culture "frankish" par la culture "XXX", sans que ça touche les personnage de la dynastie 744.

Et c'est là où je bloque un peu, j'ai regardé un peu partout pour rechercher dans les fichiers texte, mais je n'ai pas trouver comment remplacer un texte qui se trouve 2 lignes plus bas que le mot recherché.

Merci d'avance pour votre aide

2 réponses

  1. Modérateur
    Au pire tu peux faire intervenir dans un sed des retours à la ligne (\n), donc il suffit de dire que tu veux remplacer le motif 'dynasty=743\nreligion="\(.*\)"\nculture=".*"' par 'dynasty=743\nreligion="\1"\nculture="frankish"'.

    Bon le truc c'est qu'en plus tu as des espaces en début fin de lignes donc on va devoir prendre ça en compte. Une suite de 0-n espaces se note " *".

    Je pense que ça doit donner un truc du genre :

    sed -i 's/dynasty=743\n *religion="\(.*\)" *\n *culture=".*"/dynasty=743 *\n *religion="\1"\n *culture="frankish"' fichier.txt


    Bon après il faut construire ta regexp petit à petit si ça ne marche pas pour voir où elle bloque (par exemple au début tu substitues dynastie et petit à petit tu complètes le motif pour voir ce qui bloque.

    Pour plus de détails regarde comment marche sed et un cours sur les expressions rationnelles.
    https://fr.wikipedia.org/wiki/Stream_Editor
    https://fr.wikipedia.org/wiki/Expression_rationnelle

    Bonne chance
    0
    1. Contributeur
      Salut,

      En partant de ton exemple de contenu de fichier voilà ce que ça donne avec "sed". Il te faudra rajouter l'option "-i" (voire "-i.bak" pour une sauvegarde) pour une prise en compte des vraies valeurs...

      $ sed '/dynasty=743/{n;n;s/frankish/XXX/}' plop 
      205509 = { 
       name="Pierre"  
              dynasty=743  
       religion="catholic" 
       culture="XXX" 
       father=205502  
       mother=213118 
       1126.1.1 = { 
        birth="1126.1.1" 
       } 
       1183.4.10 = { 
        death="1183.4.10" 
       } 
      } 
      205511 = { 
       name="Constance" 
       female=yes 
              dynasty=744 
       religion="catholic" 
       culture="frankish" 
       father=214 
       mother=106524 
       1078.1.1 = { 
        birth="1078.1.1" 
       } 
       1108.9.1 = { 
       give_job_title=title_regent 
       } 
       1119.1.1 = { 
       remove_title=title_regent 
       } 
       1126.7.14 = { 
        death="1126.7.14" 
       } 
      } 
      
      205512 = { 
       name="Marie" 
       female=yes 
              dynasty=743 
       religion="catholic" 
       culture="XXX" 
       father=205500 
       mother=205730 
       1145.1.1 = { 
        birth="1145.1.1" 
       } 
       1198.1.1 = { 
        death="1198.1.1" 
       } 
      }
      
      $
      ;-))
      0