Extraire un champs d'un fichier : Le retour

Résolu
Ka-El Messages postés 279 Statut Membre -  
IvyAlice Messages postés 397 Statut Membre -
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.

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    Essaye avec ça :

    sed -n '/\[Directory\]/{:z;N;/\n$/! bz;/Name = fredtest/p}'
    0
    1. Ka-El Messages postés 279 Statut Membre
       
      Ben ça marche super bien !
      Merci (encore une fois...) Zipe31 !
      0
    2. Ka-El Messages postés 279 Statut Membre
       
      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
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      -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
    4. Ka-El Messages postés 279 Statut Membre
       
      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
  2. IvyAlice Messages postés 397 Statut Membre 32
     
    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
    1. Ka-El Messages postés 279 Statut Membre
       
      Merci pour ta participation IvyAlice, mais Zipe31 m'a déjà mâché tout le travail...
      Bonne continuation.
      0
    2. IvyAlice Messages postés 397 Statut Membre 32
       
      Oops autant pour moi ^^
      Merci Zipe31
      0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    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
    1. Ka-El Messages postés 279 Statut Membre
       
      ç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