|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||
|
Membre du Club
![]() Clément Technicien Réseaux & Télécommunications Inscription : décembre 2007 Messages : 148 ![]() |
Salut à tous,
J'ai un script bash grace auquel je lis un fichier. Dans ce fichier, il y a plusieurs lignes qui contiennent des champs et des valeurs comme suit : Code :
Code :
J'ai créé un script qui fonctionne très bien, mais je pense qu'il peut etre GRANDEMENT optimisé. En effet je pense que je me suis galéré un peu, mais mes faibles connaissances dans la programmation unix, ne m'ont pas laissé le choix. Voici mon script tel qu'il est à l'heure actuelle : Code :
|
||||||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Une idée comme une autre... Code :
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
||
|
|
10
|
|
|
#3 |
|
Membre du Club
![]() Clément Technicien Réseaux & Télécommunications Inscription : décembre 2007 Messages : 148 ![]() |
Trop easy quoi ...
Enfin ce que je remarque c'est que t'as pas trouvé mieux pour tester si mon fichier existait déjà, et dans le cas contraire m'avertir de la création d'un nouveau Ca veux dire que j'étais pas mauvais de ce coté la Pour le reste ... C'est possible de me donner quelques explications ?Merci!! |
|
|
00
|
|
|
#4 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
nom=$(egrep -o '\bnom=[^;]*' <<<${line})
On récupère "nom=blabla". \b Correspond à une chaîne vide à l'extrémité d'un mot. Limite entre un mot et un caractère autre qu'un mot, en gros on évite de récupérer aussi "prenom=xxx". [^;]* On récupère tout (*), jusqu'à ce qu'on rencontre un ";". le "[^;]" représente la négation. <<<${line} Redirection en entrée. On injecte la ligne. sed -n On n'affiche rien sur la sortie standard. s/=/\t/g On substitue tous (g) les signes "égale" par une tabulation (\t) s/; /\n/g On substitue tous les ";" suivis d'un espace par des fins de ligne (\n) s/^/Ligne de valeurs\t/Mg On substitue tous les débuts (^) de ligne par "Ligne de valeurs" suivi d'une tabulation "\t". Le flag "M" est un peu spécial. En fait un flux de données dans la mémoire principale de sed est vu comme une seule et même ligne, même si cette ligne contient des caractères fin de ligne. Donc sans le flag "M", la commande ajouterait juste le motif au début de la ligne et c'est tout. Grâce au flag "M", sed reconsidère chaque caractère \n comme étant la fin d'une ligne et le début d'une autre. Ce qui permet de rajouter le motif devant chaque ligne. w '"${nom#*=}"'.txt' La commande "w" (write) permet quant à elle d'écrire dans le fichier qui la suit. ${nom#*=} Ça c'est c'est propre au "bash". On supprime tout ce qui se trouve avant le signe égale et le signe lui même, donc il ne reste que le nom. Citation:
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Clément Technicien Réseaux & Télécommunications Inscription : décembre 2007 Messages : 148 ![]() |
J'ai tout compris ! Vraiment impressionant, c'est quand même bien avancé.
Je ne connaissais pas la négation avec le ^ mais juste le début de ligne. Merci beaucoup |
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Si on écrit ".*" on récupère tout. Avec "[^;]*", on récupère tout jusqu'à ce qu'on rencontre un ";" (qu'on ne prend pas ça va de soi).
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com