Recherche/remplacement de texte sur plusieurs lignes
tollan
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
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 :
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
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
A voir également:
- Recherche/remplacement de texte sur plusieurs lignes
- Remplacement coco - Accueil - Réseaux sociaux
- Coco.fr remplacement - Accueil - Réseaux sociaux
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Partage de photos en ligne - Guide
- Transcription audio en texte word gratuit - Guide
2 réponses
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 :
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
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
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...
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" } } $;-))