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 -
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 :
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:

5 réponses

Résumé de la discussion

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.

Généré automatiquement par IA
sur la base des meilleures réponses
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
 
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 />
.....

$


1
th.deudon Messages postés 449 Statut Membre 16
 
alors j'ai rien compris :))

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 ;)
0
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
 
je me suis mal exprimmé,
Tout le problème est là !

Je te l'ai déjà dit :
- Exemple concret AVANT => APRÈS
- Un maximum de détails
- etc.
0
th.deudon Messages postés 449 Statut Membre 16
 
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>
0
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
 
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 ?
0
th.deudon Messages postés 449 Statut Membre 16
 
j'etais en train d'edit, :p
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
0
th.deudon Messages postés 449 Statut Membre 16
 
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 :)
0
th.deudon Messages postés 449 Statut Membre 16
 
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
0
th.deudon Messages postés 449 Statut Membre 16
 
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 :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
th.deudon Messages postés 449 Statut Membre 16
 
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" />
0
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
 
avec quel code ?
0
th.deudon Messages postés 449 Statut Membre 16
 
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
0
th.deudon Messages postés 449 Statut Membre 16
 
Bim bim bim, un petit SED bien placé, et une deuxieme utilisation de ta commande et hop le tour est joué :)

Merci beaucoup dubcek
0