Reperer des informations pour en changer certaines
Résolu
th.deudon
Messages postés
449
Statut
Membre
-
th.deudon Messages postés 449 Statut Membre -
th.deudon Messages postés 449 Statut Membre -
Bonjour,
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 :
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 :)
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 :)
A voir également:
- Reperer des informations pour en changer certaines
- Changer dns - Guide
- Changer clavier qwerty en azerty - Guide
- Entrer les informations d'identification reseau - Guide
- Changer carte graphique - Guide
- Changer extension fichier - Guide
5 réponses
Salut,
Pour ton 1er problème, ceci devrait faire l'affaire :
Quant au second :
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 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
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 :/
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
faut lui changer
soucis : a cause de l'ancienne ligne de code, ben il a plus de nom, j'ai
au lieu de
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
comment je fais pour changer les parametres et le $i a mettre ? pour dire que le nom est en $1?
:)
je me suis mal exprimmé, les Y, Z etc seront utilisés apres le X ;)
Tout le problème est là !
Je te l'ai déjà dit :
- Exemple concret AVANT => APRÈS
- Un maximum de détails
- etc.
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 )
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>
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 ?
Dubcek, lui, il est devin :)
je l'ai fait bout par bout afin de voir avec recul
ps : avec ta commande de base j'ai sed -e ( alors que j'ai mis -i mais passons .. ) underminated s command