Reperer des informations pour en changer certaines
Résoluth.deudon Messages postés 449 Statut Membre -
Alors j'ai deux "problemes" a peu pres similaire,
le premier :
j'ai plusieurs ligne dans un fichier, exemple :
Blabla.aaaaaaa 1 2 3 4 5 6
Bliblibli.aAaA 1 2 3 4 5 6
j'aimerai que si mon programme voit BlaBla, il rajoute une ligne avec BleBle a la place mais ne touche pas au reste de la ligne ( sachant que le aaaaaaa peut etre composé de ce qu'on veut, dont des points )
le deuxieme :
j'ai un fichier avec des informations obsoletes, j'aimerai pouvoir les changer en fonctions des données que j'ai récuperer et mises dans un fichier :
le fichier contenant les données obsoletes :
AFEAG
ZFF
a
<Name = "Entity.ID.Entity" Value = ABC />
informations a ne pas changer
<Name= "LocalisationX " Value = X />
.....
fichier avec mes informations
ABC X Y Z ....
ABC2 X2 Y2 Z2
....
mon but : si on voit apres ""Entity.ID.Entity" Value =" une valeurs qui est en $1 du deuxieme fichier, qu'on repere les prochaines infos contenue apres "<Name= "LocalisationX " Value =" et qu'on les change par mon $2 de la ligne correspondante
je suis sur le shell
Merci :)
5 réponses
Deux problématiques se dégagent : remplacer automatiquement une occurrence en début de ligne (BlaBla) par BleBle sans toucher au reste, et mettre à jour des valeurs dans des blocs XML selon un fichier de données. Pour le premier, une solution typique consiste à utiliser sed afin de remplacer la première occurrence de BlaBla par BleBle en début de ligne sans altérer le reste. Pour le second, des scripts shell ou awk lisent un fichier de correspondance et mettent à jour les balises Entity.ID.Entity et les blocs LocalisationX en remplaçant Value par les valeurs associées. Des variantes montrent l'utilisation de sed pour des occurrences multiples ou la création/suppression de blocs, selon le nombre de lignes et de correspondances, dans certains cas.
-
Salut,
Pour ton 1er problème, ceci devrait faire l'affaire :sed '0,/^BlaBla/ s//BleBle/' fichier
Quant au second :$ ls f1 f2 foo.sh $ cat f1 AFEAG ZFF a <Name = "Entity.ID.Entity" Value = ABC2 /> informations a ne pas changer <Name= "LocalisationX " Value = X /> ..... AFEAG ZFF a <Name = "Entity.ID.Entity" Value = ABC3 /> informations a ne pas changer <Name= "LocalisationX " Value = X /> ..... $ cat f2 ABC2 X2 Y2 Z2 ABC3 X3 Y3 Z3 $ cat foo.sh #! /bin/bash while read nom param reste do sed -i '/<Name = "Entity.ID.Entity" Value = '"${nom}"'/{n;n;s/\(Value = \)[^ ]*/\1'"${param}"'/}' f1 done < f2 $ ./foo.sh $ cat f1 AFEAG ZFF a <Name = "Entity.ID.Entity" Value = ABC2 /> informations a ne pas changer <Name= "LocalisationX " Value = X2 /> ..... AFEAG ZFF a <Name = "Entity.ID.Entity" Value = ABC3 /> informations a ne pas changer <Name= "LocalisationX " Value = X3 /> ..... $
-
-
-
Je vais essayer de te montrer.... mais c'est pas facile, j'ai pas le droit de montrer mes fichiers :/
les données inutiles : ....
fichier 1 :........ < PeriodicEvent> ..... <Field Name="Entity.ID.Entity" Value="ABC" /> <Field Name......... Value="......" /> .... ..... <Field Name......... Value="......" /> <Field .... <Field Name= "Localisation.X " Value = "AZE" /> <Field Name= "Localisation.Y " Value = "AvE" /> <Field Name= "Localisation.Z " Value = "AxE" /> ....... <Field Name= "Orientation.A" Value = "AgE" /> <Field Name= "Orientation.B" Value = "AlE" /> <Field Name= "Orientation.C" Value = "AmE" /> ....... < /PeriodicEvent> ( est en autant d'exemplaire que de ligne dans le second fichier ) ........... ............ ( plein d'informations inutiles )
fichier 2 :
pour chaque ligne j'ai : nom X Y Z A B C ( sous cette forme )Nom1 X1 Y1 Z1 A1 B1 C1 Nom2 X2 Y2 Z2 A2 B2 C2 ZOubi1 X3... Zoubi2 .... Zoubi3..... etc
fichier voulu :........ < PeriodicEvent> ...... <Field Name="Entity.ID.Entity" Value="Nom1" /> <Field Name......... Value="......" /> .... ..... <Field Name......... Value="......" /> <Field .... <Field Name= "Localisation.X " Value = "X1" /> <Field Name= "Localisation.Y " Value = "Y1" /> <Field Name= "Localisation.Z " Value = "Z1" /> ....... <Field Name= "Orientation.A" Value = "A1" /> <Field Name= "Orientation.B" Value = "A2" /> <Field Name= "Orientation.C" Value = "A3" /> ....... < PeriodicEvent> ( le faire pour chaque élément comprenant <Field Name="Entity.ID.Entity" Value=" avec un nom dans mon fichier 2 ), si il existe un bloc mais avec un nom non présent, ne pas y toucher ........... ............ ( plein d'informations inutiles )
EDIT : si il y n'y a pas tous les Zoubis dans le fichier 1 ( sachant qu'il y en a forcement au moins 1 ), il faudrait en créer pour que chaque Zoubi ait son bloc ( ils sont tous identiques pour les Zoubis , sauf X,Y,Z,A,B,C ) .... désolé, complication de derniere minute
le bloc commence avec < PeriodicEvent> et finit avec </ PeriodicEvent> -
Je comprend très bien que tu n'aies pas le droit de montrer des données confidentielles, mais on n'est pas devin ;-\
D'où l'importance de nous donner des exemples proches de la réalité et de bien expliquer ce que tu veux.
Là par exemple, c'est bien tu nous donnes un exemple AVANT à peu près conforme, mais APRÈS tu veux quoi ? -
-
-
je ne sais pas si ca peut aider, mais j'ai facilement eu le premier fichier ( celui du premier probleme ) avec deux fois la ligne avec Blabla, suffit juste d'en changer 1 sur 2 en fait :)
-
Ps : j'ai meme reussi a mettre le BlaBla a changer en premier.. :)
du coup faut juste changer le premier BlaBla avant le premier . du fichier en BleBle
en gros j'ai
BlaBla.fzefz ezfze zefze zef
BlaBla.fzad azf ze z ezf ze
AEZFe zefZEF ZEFZE
et je veux
BleBle.fzefz ezfze zefze zef
BlaBla.fzad azf ze z ezf ze
AEZFe zefZEF ZEFZE -
premier probleme résolu, j'ai split toutes les chaines et j'ai fait print "BleBle" $2 $3....
le deuxieme par contre me pose une bonne colle :/ -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Raaaah j'ai un soucis :(((((
En fait y a un deuxieme bloc nom2 tout en bas, et il faut lui changer certaines infos, au lieu de changer<Field Name= "Localisation.X " Value = "x4" /> <Field Name= "Localisation.Y " Value = "y4" /> <Field Name= "Localisation.Z " Value = "z4" /> ....... <Field Name= "Orientation.A" Value = "a4" /> <Field Name= "Orientation.B" Value = "b4" /> <Field Name= "Orientation.C" Value = "c4" />
faut lui changer<Field Name= "Syst.Localisation.X " Value = "x4" /> <Field Name= "Syst.Localisation.Y " Value = "y4" /> <Field Name= "Syst.Localisation.Z " Value = "z4" />
soucis : a cause de l'ancienne ligne de code, ben il a plus de nom, j'ai<Field Name="Entity.ID.Entity" Value="" />
au lieu de<Field Name="Entity.ID.Entity" Value="Nom2" />
-
-
la ligne awk 'NR==FNR {t[++n]=$0; next} /ZOub/ {split($0, a); for(m=1; m<=n; m++){$0=t[m]; if(/Field Name/ && /Entity.ID|Localisat|Orienta/){if(/Entity/){f=1}; sub("Value[ ]*=[ ]*\"[^\"]*", "Value=" "\"" a[f++])}; print}}' fichier3 fichier2 , mais finalement je vais essayer par sub ;) j'ai eu cette idée ce matin, je test
-
-