#26 Le 01/02/2020, à 23:46
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
J'ai testé ça et ça fonctionne pas malheureusement, je me suis craqué sur un truc ?
while IFS='' read -r line; do
if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[([a-Z]+)\]$ ]]; then
c+=("${line1:-1}")
fi
unset a b c
done < <(cat /etc/mesfics-*.conf)
echo "${a[*]}"
echo "${b[*]}"
echo "${c[*]}"
Perso je vois pas
Dernière modification par Spyki (Le 01/02/2020, à 23:47)
Hors ligne
#27 Le 01/02/2020, à 23:57
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ben là tu réinitialises les tableaux à chaque ligne lue, donc je sais pas trop à quoi ça peut aboutir…
Le unset a b c était fait pour être mis en dehors de la boucle while, lorsqu'elle est incluse dans une boucle for sur les noms de fichiers.
Si tu envoies tous tes fichiers concaténés à la boucle while, le unset n'a plus de sens.
Dernière modification par kamaris (Le 01/02/2020, à 23:57)
Hors ligne
#28 Le 02/02/2020, à 00:06
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ok j'ai mis unset à la fin et effectivement c'est un peu mieux.
L'autre problème maintenant c'est que la 3ème variable me renvoie la valeur de 1 pendant la 1ère boucle, 1 1 pendant la 2ème boucle, 1 1 1 pendant la 3ème boucle, etc... (au lieu de renvoyer du texte)
Hors ligne
#29 Le 02/02/2020, à 00:23
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
aah c'est bon j'ai vu ma faute :
c+=("${line1:-1}")
au lieu de : (il manquait les
c+=("${line:1:-1}")
Hors ligne
#30 Le 02/02/2020, à 00:29
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Eh oui
$ unset foo
$ echo ${foo:-bar}
bar
$
Hors ligne
#31 Le 02/02/2020, à 00:58
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
En tout cas merci pour ton aide.
Pour bien parfaire mon script, faudrait juste enlever un texte qui est compris dans l'un de mes fichiers qui ne doit pas être compris dans la troisième variable.
Ce qui donne ça à peu près sur mes fichiers où je choppe les variables :
#zezaeaze 545.356.655#
xxxx
xxx
xxxxx
[useless]
xxxxx
[useful]
xxxxx
[useful]
[useful]
[useful]
Du coup, je voudrais virer le useless entre crochet pour ne garder que les useful.
J'imagine que sur la ligne de elif je dois rajouter un "!" + quelque chose ?
Dernière modification par Spyki (Le 02/02/2020, à 01:08)
Hors ligne
#32 Le 02/02/2020, à 01:10
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Oui :
elif [[ $line =~ ^\[([a-Z]+)\]$ && $line != '[useless]' ]]; then
Hors ligne
#33 Le 02/02/2020, à 01:37
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ok merci j'aurais vraiment pas trouvé, faudrait vraiment que je me forme sur ça, c'est a l'air super intéressant
Je pense que cette fois, on peut vraiment dire que le problème est résolu.
Merci encore et bonne soirée à toi
Hors ligne
#34 Le 02/02/2020, à 01:52
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
De rien
Pour te former, tu peux commencer par ça : http://aral.iut-rodez.fr/fr/sanchis/ens … index.html
Ensuite tu fais man bash, et tu apprends tout par cœur
Hors ligne
#35 Le 02/02/2020, à 17:25
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ah zut, j'avais tout testé depuis un fichier où ça marchait super bien sans prendre en compte mes autres fichiers nouvellement crée.
Ce qui fait qu'il boucle sur ma première et deuxième variable lorsqu'il boucle sur le second fichier, voilà ce que j'ai mis (sachant que ma 3ème variable fonctionne très bien, pas de problème de boucle)
while IFS='' read -r line; do
if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[([a-Z]+)\]$ && $line != '[useless]' ]]; then
c+=("${line:1:-1}")
echo "${a[*]}"
echo "${b[*]}"
echo "${c[*]}"
unset c
fi
done < <(cat /etc/mesfics-*.conf)
Exemple boucle du premier fichier OK
Exemple boucle du deuxieme fichier : aaa aaa 112.111.111 112.111.111 xxxxxyyyyy
etc...
La troisième variable ne bouge pas et c'est ce que je veux, mais j'arrive pas à faire en sorte qu'il ne prenne pas en compte ma première et seconde variable lors du passage de mon second, troisième, etc... fichier
J'ai essayé de placer des unset a b un peu partout sans succès
Dernière modification par Spyki (Le 02/02/2020, à 17:53)
Hors ligne
#36 Le 02/02/2020, à 18:26
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Je sais pas ce que tu essaies de faire exactement, car tes explications sont assez confuses.
Mais en tout cas, ça n'est pas en saupoudrant des unset ou autre commande un peu partout qu'on arrive à ses fins, c'est en comprenant ce qu'on fait, et donc, ce que fait le programme.
Si tes tableaux sont alimentés quand ils ne devraient pas l'être, c'est parce que tes expressions régulières sont mal écrites : un unset n'y changera rien.
Hors ligne
#37 Le 02/02/2020, à 18:40
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ok ce que je cherche à faire, concrètement c'est ça :
Fichier conf numéro 1 :
#aaaa 12.12.12#
[useless]
[usefula]
[usefulb]
[usefulc]
[useful4]
Fichier conf numéro 2 :
#bbbb 34.34.34#
[useless]
[usefuld]
[usefule]
[usefulf]
[usefuli]
Fichier conf numéro 3 :
#cccc 56.56.56#
[useless]
[usefulj]
[usefulk]
[usefull]
[usefulm]
Donc pour la première boucle du premier fichier tout se passe bien, il prend bien :
Variable 1 :
aaaa
Variable 2 :
12.12.12
Variable 3 :
usefula usefulb usefulc usefuld
Lors du bouclage du second fichier il vient faire :
Variable 1 :
aaaa aaaa bbbb
Variable 2 :
12.12.12 12.12.12 34.34.34
Variable 3 :
usefule usefulf usefulg usefulh
Donc tout est bon pour cette 3ème variable
La seule chose que je veux c'est qu'il fasse les choses correctement lors du passage du second/troisième/etc... fichier de cette manière
Variable 1 :
aaaa<boucle1> bbbb<boucle2> cccc<boucle3>
Variable 2 :
12.12.12<boucle1> 34.34.34<boucle2> 56.56.56<boucle3>
Variable 3 :
usefula usefulb usefulc usefuld<boucle1> usefule usefulf usefulg usefulh<boucle2> usefuli usefulj usefulk usefull<boucle3>
C'est mieux dit comme ça ?
(j'ai édit mon message à la fin sur variable 3)
edit 2 : encore modifié, peut être que dit de manière plus pro les 2 premières variables sont constantes du moment qu'on boucle sur le même fichier et que la troisième est vraiment variable mais change lorsqu'il boucle sur un autre fichier
Dernière modification par Spyki (Le 02/02/2020, à 19:11)
Hors ligne
#38 Le 02/02/2020, à 21:36
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
C'est mieux dit comme ça ?
Oui, c'est déjà plus compréhensible
Par contre, je ne sais pas trop comment tu te débrouilles pour obtenir ce que tu dis, c'est-à-dire quel code tu exécutes exactement (c'est cela qui manque encore dans ton post, même s'il est plus clair).
En ce qui me concerne, en partant de tes trois fichiers (avec une petite correction des numérotations) :
$ cat f{1..3}
#aaaa 12.12.12#
[useless]
[usefula]
[usefulb]
[usefulc]
[usefuld]
#bbbb 34.34.34#
[useless]
[usefule]
[usefulf]
[usefulg]
[usefulh]
#cccc 56.56.56#
[useless]
[usefuli]
[usefulj]
[usefulk]
[usefull]
$
et en exécutant dessus ce code :
$ cat test.sh
#!/bin/bash
while IFS='' read -r line; do
if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[([a-Z]+)\]$ && $line != '[useless]' ]]; then
c+=("${line:1:-1}")
fi
done < <(cat f{1..3})
echo "${a[*]}"
echo "${b[*]}"
echo "${c[*]}"
$
j'obtiens ceci :
$ ./test.sh
aaaa bbbb cccc
12.12.12 34.34.34 56.56.56
usefula usefulb usefulc usefuld usefule usefulf usefulg usefulh usefuli usefulj usefulk usefull
$
Donc pas de problème
Hors ligne
#39 Le 02/02/2020, à 22:31
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Alors oui ça me ressort comme ça aussi donc en théorie pas de problème.
Je viens de me rendre compte que tester comme ça, n'est pas un bon test :
echo "${a[*]}"
echo "${b[*]}"
echo "${c[*]}"
Mais concrètement quand j'utilise une commande ça ne va pas.
J'ai besoin que :
- ma 1ère variable se vide dès qu'il change de fichier pour laisser place à la nouvelle du second fichier (donc ma 1ère variable est constante et doit se vider comme lors d'un unset lorsqu'il arrive au second fichier)
- ma 2ème variable se vide dès qu'il change de fichier pour laisser place à la nouvelle du second fichier (donc ma 2ème variable est constante et doit se vider comme lors d'un unset lorsqu'il arrive au second fichier)
- ma 3ème variable doit se vide dès qu'il change sa 3ème variable + dès qu'il change de fichier (celui est ok, le unset dans la boucle règle ce problème)
Un vrai test devrait ressembler à ça en fait :
echo "ma commande numéro une ${a[*]} / ${b[*]} / ${c[*]}"
echo "ma commande numéro deux ${a[*]} / ${b[*]} / ${c[*]}"
Tu verras que ça ne se remplit pas correctement lors de la boucle du premier fichier a et b doivent être constant, y'a juste le c qui changent de valeur 4 fois (dans notre exemple avec les usefula, usefulb, usefulc et usefuld)
Teste de ton côté et dis moi si tout fonctionne
Dernière modification par Spyki (Le 02/02/2020, à 22:32)
Hors ligne
#40 Le 02/02/2020, à 23:49
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Ben oui, mais à ce moment-là c'est ce que je te disais en #21, puis en #27 :
Le unset a b c était fait pour être mis en dehors de la boucle while, lorsqu'elle est incluse dans une boucle for sur les noms de fichiers.
Il ne faut pas que tu concatènes tes fichiers si tu ne veux pas accumuler les données dans tes tableaux, ça devrait quand même être évident…
Donc pour ce que tu veux faire :
$ cat test.sh
#!/bin/bash
for f in f{1..3}; do
unset a b
while IFS='' read -r line; do
if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[([a-Z]+)\]$ && $line != '[useless]' ]]; then
unset c
c+=("${line:1:-1}")
echo "${c[*]}"
fi
done < "$f"
echo "${a[*]}"
echo "${b[*]}"
done
$ ./test.sh
usefula
usefulb
usefulc
usefuld
aaaa
12.12.12
usefule
usefulf
usefulg
usefulh
bbbb
34.34.34
usefuli
usefulj
usefulk
usefull
cccc
56.56.56
$
Hors ligne
#41 Le 03/02/2020, à 00:01
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
AAAHH GROS MERCI !
T'es un génie mec, tout fonctionne super bien
Hors ligne