#1 Le 30/01/2020, à 23:13
- Spyki
[RESOLU] Besoin d'aide concernant l'utilisation de sed
Hello tout le monde, je bute sur un problème dont j'arrive pas à me dépêtrer car jsuis pas doué avec la commande sed (qui je sais devrais faire mon bonheur), enfin bref je commence à manquer de temps car d'habitude je me serais un peu plus acharner sur le problème donc j'espère que vous pourrez m'aider
Le problème est assez simple, je voudrais créer me créer 2 variables en faisant la bonne découpe d'un fichier de ce type :
[azerty1.2.3]
xxxxxxxxxxxxxxxxxxxxxx
xxx
xxxxx
[qwerty5.2.3]
xxxxxxx
xxxxxxxxx
xxxxx
[blabla999.44.222]
xxxx
xxxxx
Je voudrais du coup avec la commande sed stocker toutes les variables qui sont dans les crochets pour :
Stocker dans la premier variable (azerty qwerty blabla)
Stocker dans la seconde variable (1.2.3 5.2.3 999.44.22)
Bien évidemment avant cette commande je fais un "echo monfichier".
J'espère que mon problème est simple, merci d'avance pour votre aide
EDIT : MERCI KAMARIS
Dernière modification par Spyki (Le 03/02/2020, à 00:22)
Hors ligne
#2 Le 30/01/2020, à 23:31
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
salut,
Bien évidemment avant cette commande je fais un "echo monfichier".
pourquoi ?
Stocker dans la premier variable (azerty qwerty blabla)
Stocker dans la seconde variable (1.2.3 5.2.3 999.44.22)
quels sont les critères d'identification d'une partie par rapport à l'autre.
stocker dans des variables (shell ?), qui auront quelles formes ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 30/01/2020, à 23:38
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Merci pour ta réponse rapide, j'ai eu le temps de décomplexifier mon fichier où je dois chopper mes variables
Ce qui donne visuellement plutôt ça maintenant :
azerty1.2.3
qwerty5.2.3
blabla999.44.22
Les critères pour identifier ca serait quelque chose comme ça :
Variable 1 : tout le texte (sans les chiffres à droite)
Variable 2 : tous les chiffres . tous les chiffres . tous les chiffres (sans le texte à gauche)
J'espère que j'ai bien répondu à ta question
Dernière modification par Spyki (Le 30/01/2020, à 23:39)
Hors ligne
#4 Le 30/01/2020, à 23:52
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Tu peux faire ça en bash, en repartant de ton premier exemple :
while IFS='' read -r line; do
if [[ $line =~ ^\[.*\]$ ]]; then
line=${line:1:-1}
a+=("${line%%[0-9]*}")
b+=("${line##*[a-zA-Z]}")
fi
done < tonFichier
Le tableau a contient le texte, le tableau b contient les chiffres :
$ echo "${a[*]}"
azerty qwerty blabla
$ echo "${b[*]}"
1.2.3 5.2.3 999.44.222
$
Hors ligne
#5 Le 30/01/2020, à 23:55
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Je vais tester ta solution et l'adapter, jte tiens au jus
Hors ligne
#6 Le 31/01/2020, à 00:11
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
dans le même esprit :
rgx='([a-Z]+)([0-9.]+)'
while read line; do [[ $line =~ $rgx ]]; a+=("${BASH_REMATCH[1]}"); b+=("${BASH_REMATCH[2]}" ); done <fichier
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#7 Le 31/01/2020, à 00:15
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Désolé jvous donne une autre info un peu tardivement mais je peux pas faire le :
done <mesfichiers*.conf
Ca me met un message comme quoi y'a une redirection ambiguë (mon but est de cibler plusieurs fichiers similaires)
Dernière modification par Spyki (Le 31/01/2020, à 00:16)
Hors ligne
#8 Le 31/01/2020, à 00:19
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
alors, il faut boucler sur chaque fichier.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#9 Le 31/01/2020, à 00:31
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Si ça vous intéresse je vous donne le code que j'ai commencé à écrire, ça sera plus simple pour savoir de quoi on parle :
#!/bin/bash
for fichier in `ls /etc/mesfichiers-*.conf`
do
for section in `grep '\[.*\]' $fichier | sed 's/\[\(.*\)\]/\1/g'`
do
VAR1 = `echo $fichier | sed xxxxx `
VAR2 = `echo $section | sed xxxxxxxxx`
VAR3 = `echo $section | sed xxxxxxxxxx`
echo "$VAR1 $VAR2 $VAR3"
done
done
C'était un travail que j'avais déjà réussi avec sed mais ça remonte à pas mal de temps, ce qui nous intéresse dans notre exemple c'est de bien mettre dans la variable 2 (VAR2) le texte et dans la variable 3 (VAR3) les chiffres avec les points
Hors ligne
#10 Le 31/01/2020, à 00:33
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Sympa le BASH_REMATCH, ça permet de simplifier pas mal de choses, niveau écriture comme niveau calculs
Je remets ce que j'ai donné plus haut en l'incorporant du coup :
while IFS='' read -r line; do
if [[ $line =~ ^\[([a-Z]+)([0-9.]+)\]$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
fi
done < tonFichier
@Spyki : si tu te moques de quel fichier proviennent tes données, tu peux aussi les concaténer et envoyer le tout dans la boucle while :
done < <(cat mesfichiers*.conf)
Hors ligne
#11 Le 31/01/2020, à 00:34
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Aaaah.
pas ls !
pas grep|sed !
pas d'espaces autour du égal.
on te donne un code propre, il n'y a qu'à boucler autour, et tu en fais ça !? pouah.
Dernière modification par Watael (Le 31/01/2020, à 00:34)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#12 Le 31/01/2020, à 00:36
- cqfd93
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Modération
Ça serait bien de mettre un titre entièrement en français…
− cqfd93 −
Hors ligne
#13 Le 31/01/2020, à 00:38
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Aaaah.
pas ls !
pas grep|sed !
pas d'espaces autour du égal.on te donne un code propre, il n'y a qu'à boucler autour, et tu en fais ça !? pouah.
Naaan pas du tout, c'est ce que j'avais fait avant la discussion et je galérais
Hors ligne
#14 Le 31/01/2020, à 00:45
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
ouf, je respire.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#15 Le 31/01/2020, à 00:59
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
En tout cas tout fonctionne super bien.
Petit question à la con étant donné qu'on est si bien lancé et que ça marche si bien.
Je voudrais alimenter ma troisième variable avec le même principe toujours avec les crochets :
[aaa bbb111.222.333]
[aaa ccc648.5.7]
etc...
sur autre un fichier ça ressemblerait du coup à :
[bbb yyyyy111.222.333]
[bbb zzzz648.5.7]
(nouvelle variable à la découpe)
VAR 1 : le texte de gauche seulement et s’arrête quand il voit un espace
VAR 2 : le texte du milieu (sans le texte de gauche et les chiffres de droite)
VAR 3 : les chiffres de droite avec les points sans les textes de gauche
En tout cas, vous gérez grave c'est cool
Dernière modification par Spyki (Le 31/01/2020, à 01:00)
Hors ligne
#16 Le 31/01/2020, à 02:11
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Là c'est juste une petite adaptation de l'expression régulière (avec un élément de BASH_REMATCH en plus ensuite pour la troisième variable) :
^\[([a-Z]+)\ ([a-Z]+)([0-9.]+)\]$
Hors ligne
#17 Le 31/01/2020, à 09:24
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Parfait, je viens à me demander, à quoi sert sed au juste ?
Problème résolu en tout cas
Dernière modification par Spyki (Le 31/01/2020, à 09:25)
Hors ligne
#18 Le 31/01/2020, à 14:08
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
sed sert à manipuler des flux.
Il est beaucoup plus puissant et rapide que bash pour ça, mais lorsqu'il s'agit d'extraire simplement quelques données à dispatcher dans des variables, ça n'est pas forcément le plus pratique, et on peut au moins s'en passer.
Ceci dit, si tes fichiers de données commencent à être un peu gros, sed se montrera vite plus rapide.
Pour ton dernier exemple de format de données, tu peux par exemple essayer de comparer, pour remplir le tableau a, la méthode full bash donnée plus haut, avec ça :
mapfile -t a < <(sed -nE 's/^\[([a-zA-Z]+) ([a-zA-Z]+)([0-9.]+)\]$/\1/p')
Selon le nombre de tableaux à remplir et la taille du fichier d'entrée, sed prendra plus ou moins vite l'avantage, mais il finira par le prendre.
Hors ligne
#19 Le 31/01/2020, à 14:55
- Watael
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
ou on passe à awk, qui allie la manipulation des regex et la simplicité/lisibilité d'un langage de haut niveau comme le shell;
parce que lire un script sed...
Dernière modification par Watael (Le 31/01/2020, à 14:56)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#20 Le 01/02/2020, à 19:04
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Zut j'ai pas vu mais y'a un soucis dans ce que vous m'avez donner pour stocker les variables
Dans la première boucle tout se passe bien mais dans la seconde boucle, il garde en mémoire ce qu'il y avait marqué dans la première et ainsi de suite pour la troisième puis quatrième.
Vous avez des solutions ?
Exemple :
1ère variable après 1 ère bouche après un echo dessus :
bbb
après une 2 ème boucle :
bbb bbb
après une 3 ème boucle :
bbb bbb bbb
etc...
Dernière modification par Spyki (Le 01/02/2020, à 19:30)
Hors ligne
#21 Le 01/02/2020, à 20:08
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Il faut que tu réinitialises les tableaux avant la boucle while :
unset a b c
Hors ligne
#22 Le 01/02/2020, à 20:23
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Parfait
Hors ligne
#23 Le 01/02/2020, à 22:28
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
J'ai encore réarranger mon fichier pour que cela fasse plus propre de cette manière :
Sur mon fichier où je récupère ressemble à ça désormais :
#bbb 111.222.333#
xxxxx
xxxx
xxxxxx
[yyyyzzzz]
Le truc maintenant c'est que j'arrive bien à attraper les 2 premières variables qui sont entre # et en ajustant les commandes ci-dessus mais je n'arrive pas à prendre la 3ème variable qui est entre crochet [yyyzzzz]
Ca va faire 1 heure que je m'acharne à faire un "&&" ou un "and" et j'arrive pas à comprendre comment prendre cette 3ème variable
Si vous pouviez m'aider, ça serait cool
Dernière modification par Spyki (Le 01/02/2020, à 22:29)
Hors ligne
#24 Le 01/02/2020, à 23:04
- kamaris
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
Tu peux décomposer les cas comme ça :
if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
a+=("${BASH_REMATCH[1]}")
b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[[a-Z]+\]$ ]]; then
c+=("${line:1:-1}")
fi
Hors ligne
#25 Le 01/02/2020, à 23:13
- Spyki
Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed
aaah ok j'avais aussi tester le elif mais ça marchait pas également
Je teste tout ça, merci que tu sois au aussi réactif
Dernière modification par Spyki (Le 01/02/2020, à 23:14)
Hors ligne