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 :)
- Reperer des informations pour en changer certaines
- Changer dns - Guide
- Entrer les informations d'identification reseau - Guide
- Changer clavier qwerty en azerty - Guide
- Changer écriture facebook - Guide
- Changer carte graphique - Guide
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.
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 />
.....
$
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
le deuxieme par contre me pose une bonne colle :/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionEn 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" />
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