Recherche/remplacement de texte sur plusieurs lignes

Fermé
tollan - Modifié par mamiemando le 25/03/2013 à 10:30
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 25 mars 2013 à 10:45
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

mamiemando Messages postés 33268 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 septembre 2024 7 780
Modifié par mamiemando le 25/03/2013 à 10:49
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
25 mars 2013 à 10:45
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