|
Publicité | ||||||||||||||||||||||
|
|
#1 | ||||||||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
Bonjour à tous.
J'ai un problème plus que tordu... Voilà, j'ai un fichier fichier1 dont le contenu peut ressembler à ca : Code :
J'ai une variable var qui vaut "valeur1" et une variable var2 qui vaut "valeur2" L'idée, c'est donc de copier mon fichier1 vers fichier2 et de remplacer dans fichier2 __var__ par le contenu de $var et __var2__ par le contenu de $var2... Pour l'instant, j'arrive à faire ca : Code :
cat fichier1 | sed 's/__\(.*\)__/${\1}/g' >fichier2 Ce qui donne un fichier2 qui ressemble à : Code :
Le résultat attendu serait plutôt : Code :
A préciser bien sûr que si j'ai, dans fichier1, le motif __supervariable__, il doit être remplacé par le contenu de $supervariable... La substitution des variables fonctionne avec le code suivant : Code :
Le souci, c'est que mon fichier2 s'en retrouve amputé de toutes les indentations... J'imagine que c'est le eval qui est responsable de cette amputation... Et du coup, là, je bloque... J'ai essayé avec awk et du gensub, mais je suis confronté aux mêmes problèmes finalement... Si quelqu'un a une idée, c'est avec grand plaisir que j'accueillerais sa solution Merci d'avance à tous. Deupac. |
||||||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : février 2008 Messages : 1 897 ![]() |
Bonjour deupac,
Je ne comprend pas... tu connais la valeur de var1 du fichier_1 ? dans le pire des cas :... ? |
|
|
00
|
|
|
#3 | ||
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
une réponse avec awk:
Code :
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
||
|
|
00
|
|
|
#4 | ||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
Merci pour la solution, elle fonctionne.
Le problème est que je ne connais pas forcément la totalité des motifs que contient fichier1. Pour être plus précis, je peux tout à fait avoir une collection de variables : Code :
Le fichier1 peut quant à lui contenir un, plusieurs ou aucun des motifs correspondant. Par exemple on peut avoir un fichier1 qui ressemble à ca : ou bien qui ressemble à : ou encore à : Le nombre de motifs n'est pas connu d'avance, et donc remplacer spécifiquement un motif par sa variable correspondante n'est pas possible. Merci ! |
||
|
|
00
|
|
|
#5 | ||
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
En (très) rapide:
Si tu as les variables var_1 à var_n dans ton script, c'est que tu connais le nombre max de changement à faire: n. Il faut alors demander les n changements dans le fichier à traiter. Si le motif n'est pas présent, c'est pas grave: aucun changement ne sera effectué. Code :
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
||
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
Je suis bien d'accord avec toi et j'avais déjà pensé à cela, mais dans un souci d'évolutivité et de maintenabilité, si je rajoute une variable à ma collection de base, je préfèrerais ne pas avoir à l'ajouter en plus dans le awk, d'où mon besoin de substitution des variables de façon dynamique (je sais pas si je suis clair dans mes explications, si je ne le suis pas, il ne faut pas hésiter à me le signaler
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : février 2008 Messages : 1 897 ![]() |
"maintenabilité" ? oh, le barbarisme !
ça existe ? entretien (à venir) ... ? |
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
http://fr.wikipedia.org/wiki/Maintenabilit%C3%A9
Néologisme à la limite si tu veux, barbarisme, on va peut-être pas exagérer. Merci néanmoins pour ta constructive contribution. |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() Inscription : février 2008 Messages : 1 897 ![]() |
soit, c'est un terme entendu/convenu.
(argh, je deteste les conventions, quand elles ne sont pas essentielles reste qu'il est horrible ! |
|
|
00
|
|
|
#10 | ||||||||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
Reste qu'un terme qu'on trouve aussi dans le dictionnaire larousse ne peut selon moi plus vraiment être appelé "entendu / convenu". En fait ca existe, point barre.
Par contre, puisque je n'avais pas voulu lancer un débat de langue vivante dans mon premier post, j'en reviens à l'essentiel... Bref, voilà une solution à mon problème pour ceux que cela pourrait intéresser... Je reprends depuis le début. Soit un fichier1 : Code :
On se moque donc de savoir si les variables $var, $var2, $var3 etc sont valorisées..., si elles sont vides, alors les motifs correspondants seront remplacés par du vide. Le code : Code :
Le résultat (en admettant que $var, $var2 et $var3 soient respectivement valorisées à valeur, valeur2 et valeur3) : Code :
Autre résultat, en admettant que seules $var et $var2 soient valorisées : Code :
Les occurrences de __var3__ sont remplacées par du vide. Le seul truc qui ne correspond pas à ce que je veux, c'est que je perd les tabulations. Je n'ai pas encore trouvé de moyen de les conserver, mais je garde espoir. Merci pour vos contributions. Deupac. |
||||||||
|
|
00
|
|
|
#11 | ||||||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 12 ![]() |
Les réponses ne se bousculent pas, aussi j'imagine que le post n'intéresse pas grand monde, cependant, je vais quand même poster la solution que j'ai adopté (qui a vachement moins la classe qu'une paire de sed et de awk, mais tant pis
Le awk que je proposais juste avant me posait un problème : si le motif __*__ n'était pas suivi d'un caractère vide, ca ne fonctionnait pas. Soit le fichier "fichier" : Code :
Le script complet qui fait la transformation est comme ca : Code :
Explications : le cp du fichier source vers le fichier cible permet de garder l'indentation si chère à mes yeux. dans le for : le grep -o récupère et n'affiche que les motifs __*__ dans le for : le sed dégage les __ du résultat renvoyé par le grep -o lavar stocke le nom du motif courant amputé de ses __ le sed : remplace le motif complet courant par le contenu de la variable qui porte le même nom que le motif sans __, ceci via référence indirecte, puisque si var=coucou et que coucou=bonjour, alors ${!var} = bonjour. le sed modifie bien entendu directement le fichier cible. Le fichier "autrefichier" resultat : Code :
J'en profite pour passer le post en résolu. Merci à jmelyn, seul et unique contributeur à mon problème Deupac. |
||||||
|
|
00
|
|
|
#12 | ||
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
Bonjour Deupac,
Tout d'abord je voudrais préciser ceci: ce n'est pas parce que je ne mets pas de réponse que je ne réfléchis pas au problème. Hier j'ai passé un moment sans solution correcte. Et puis au travail ce n'est pas ma première priorité, même si je m'améliore très nettement en lisant les problèmes, en cherchant des solutions et en découvrant les solutions des autres. Cet aprèm j'ai trouvé quelque chose qui pourrait t'intéresser: Code :
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
||
|
|
00
|
|
|
#13 | ||
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 685 ![]() |
Alors, petite restriction précédente enlevée: il peut maintenant y avoir des espaces dans les variables var[i]:
Code :
Bien sûr, je suppose que le caractère '#' n'apparait pas dans les valeurs de var puisque c'est un séparateur. Mais c'est maintenant paramétrable, on peut mettre ce qu'on veut.
__________________
Un problème bien posé est déjà résolu (H. Bergson). |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com