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
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
A voir également:
- Extraire un champs d'un fichier : Le retour
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Ouvrir un fichier .bin - Guide
- Extraire une video youtube - Guide
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
30 nov. 2011 à 12:06
Salut,
Essaye avec ça :
Essaye avec ça :
sed -n '/\[Directory\]/{:z;N;/\n$/! bz;/Name = fredtest/p}'
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
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
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
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
30 nov. 2011 à 13:39
Merci pour ta participation IvyAlice, mais Zipe31 m'a déjà mâché tout le travail...
Bonne continuation.
Bonne continuation.
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
30 nov. 2011 à 15:49
Oops autant pour moi ^^
Merci Zipe31
Merci Zipe31
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
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
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
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.
De toute façon ta première solution me convient très bien.
30 nov. 2011 à 13:38
Merci (encore une fois...) Zipe31 !
30 nov. 2011 à 13:43
30 nov. 2011 à 13:59
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.
30 nov. 2011 à 14:08
Merci beaucoup je me sens plus intelligent ;-)
Je ne devrais plus t'embêter avec ça maintenant.
Merci encore et bonne continuation.