Extraire un champs d'un fichier : Le retour

Résolu/Fermé
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - 30 nov. 2011 à 10:03
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 - 30 nov. 2011 à 15:49
Bonjour,

Cette fois je rencontre un problème d'extraction avec le fichier dont je vous communique une partie:

NodeSibling = 0
Name = shared
Alias =
MountName = /app/XIP/Gateway/samples/web/shared
IsMbxRecording = 1
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2092
NodeParent = 1010
NodeChild = 2093
NodeSibling = 0
Name = fredtest
Alias =
MountName =
IsMbxRecording = 0
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2093
NodeParent = 2092
NodeChild = 0
NodeSibling = 2094
Name = 2aspheria
Alias =
MountName =
IsMbxRecording = 0
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2094
NodeParent = 2092
NodeChild = 0
NodeSibling = 0
Name = fredtest
Alias =
MountName =
IsMbxRecording = 0
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2095
NodeParent = 1009
NodeChild = 2096
etc...

J'ai besoin de récupérer les champs où se trouve l'information "name=frestest".
Le fichier incluant les champs doit se présenter de cette façon :


[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2092
NodeParent = 1010
NodeChild = 2093
NodeSibling = 0
Name = fredtest
Alias =
MountName =
IsMbxRecording = 0
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

[Directory]
Type = VIRTUAL_DIR
NodeIdent = 2094
NodeParent = 2092
NodeChild = 0
NodeSibling = 0
Name = fredtest
Alias =
MountName =
IsMbxRecording = 0
Comments =
UserData =
FileDisplay = XFB
FileDuplicate = duplicate

Pourriez-vous m'apporter votre aide sur le sujet, sachant que je n'ai pas réussit à me débrouiller avec le précédent dossier (Extraire un champs d'un fichier) qui ne me donne pas le résultat attendu...

En vous remerciant par avance.
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
30 nov. 2011 à 12:06
Salut,

Essaye avec ça :

sed -n '/\[Directory\]/{:z;N;/\n$/! bz;/Name = fredtest/p}'
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
30 nov. 2011 à 13:38
Ben ça marche super bien !
Merci (encore une fois...) Zipe31 !
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
30 nov. 2011 à 13:43
Je ne voudrais pas abuser zipe31, mais pourrais-tu m'expliquer la commande car l'appliquer sans en comprendre les subtilités me gêne un peu...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
30 nov. 2011 à 13:59
-n
On affichera sur la sortie standard que ce qui sera explicitement demandé plus loin avec le flag "p"


/\[Directory\]/{
Quand on rencontre le motif "[Directory\]" on exécute les commandes entre les accolades (appelé "regroupement de commandes"). Ici on a protégé les crochets contenu dans le motif (\[ et \]) pour ne pas les confondre avec ceux utilisés par les expressions régulières avec les classes de caractères.


:z
On définit une étiquette pour pouvoir s'y brancher à l'aide d'une boucle.


N
Donc une fois le motif "[Directory\]" trouvé, on ajoute la ligne suivante avec la commande "N" dans la mémoire principale de "sed" (appelé aussi "espace de travail").


/\n$/! bz
Dès lors qu'on a ajouté une ligne dans l'espace de travail, on vérifie que le contenu de notre mémoire ne se termine pas ( le "!" à la fin de la recherche du motif étant le signe de la négation) par un caractère fin de ligne (\n), le signe "$" exprimant lui la fin de la ligne. Si ce motif n'est pas trouvé, on se branche à l'étiquette ":z" et on recommence l'opération. Quand le motif est trouvé, on continue à l'instruction suivante.



/Name = fredtest/p
Sil la ligne contient le motif "Name = fredtest", alors on l'imprime (commande "p") sur la sortie standard.


}
Fin du regroupement de commandes.
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
30 nov. 2011 à 14:08
Génial je n'en attendais pas tant !
Merci beaucoup je me sens plus intelligent ;-)
Je ne devrais plus t'embêter avec ça maintenant.
Merci encore et bonne continuation.
0
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
30 nov. 2011 à 12:11
Salut,

Je t'avertis, je ne programme généralement pas de manière très subtile.
Mais si je devais faire ça:

pour chaque ligne de ton fichier d'origine
si pas égale à vide copie la ligne dans fichier.tmp
sinon
dans la variable isFredTest <-- "cat fichier.tmp | grep fredtest | grep name
si isFredTest est différent de vide(donc il a trouvé fredtest et name sur la même ligne dans le fichier avec le bloc qui vient de finir), copier fichier.tmp dans le fichier que tu as choisi
vider fichier.tmp

à la fin dans le fichier que tu as choisi tu te retrouve avec les blocs qui concernent fredtest
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
30 nov. 2011 à 13:39
Merci pour ta participation IvyAlice, mais Zipe31 m'a déjà mâché tout le travail...
Bonne continuation.
0
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
30 nov. 2011 à 15:49
Oops autant pour moi ^^
Merci Zipe31
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
30 nov. 2011 à 12:31
Si ton fichier a toujours la même structure, et que ton motif recherché est toujours suivi et précédé du même nombre de ligne à récupérer, tu peux utiliser "grep" et ses options -A et -B (voir man grep) :

grep -B7 -A7 'Name = fredtest' fichier
0
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
30 nov. 2011 à 13:42
ça marche aussi pas mal, sauf que je me retrouve avec les deux caractères "--" à la fin du premier champs.
De toute façon ta première solution me convient très bien.
0