Pages : 1
#1 Le 28/11/2018, à 11:46
- dje996
[résolu] bash valeur après grep
Bonjour,
j'ai une grosse variable "resultat" issu d'un curl qui contient dans les premières lignes :
"total_results": 197,
je voudrais mettre 197 dans une variable. Sachant que le nombre peut commence de 0.
avec ceci:
nbre=`echo "$resultat" | grep -e "total_results" | cut -c19- `
echo "nbre = '$nbre'"
il y a un espace au début de ma variable
nbre = ' 197,'
là je ne comprends pas !?
avec les regex peur t-on faire [0-200] ?
Où y a t-il un moyen plus simple ?
Dernière modification par dje996 (Le 04/12/2018, à 18:08)
Hors ligne
#2 Le 28/11/2018, à 11:55
- erresse
Re : [résolu] bash valeur après grep
Bonjour,
nbre="${nbre:1}"
Ça supprime le premier caractère de la variable.
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#3 Le 28/11/2018, à 11:59
- pingouinux
Re : [résolu] bash valeur après grep
Bonjour,
Ou alors
nbre=$(sed -nr 's/.*"total_results": *([0-9]+).*/\1/p' <<<"$resultat")
Ajouté :
Ou bien
nbre=$(grep -Po '"total_results": *\K\d+' <<<"$resultat")
Dernière modification par pingouinux (Le 28/11/2018, à 12:19)
Hors ligne
#4 Le 28/11/2018, à 14:19
- dje996
Re : [résolu] bash valeur après grep
merci beaucoup Pingouinux, sa marche super.
J'ai testé avec :
nbre =' "total_results": 197,'
echo "${nbre//[0-9][0-9][0-9]/}"
"total_results": ,
qui supprime le nombre 197 mais est il possible de faire l’inverse? sans utilisé de commande supplémentaire (grep, sed, cut... ) juste en bach ?
Dernière modification par dje996 (Le 28/11/2018, à 14:20)
Hors ligne
#5 Le 28/11/2018, à 15:53
- ar barzh paour
Re : [résolu] bash valeur après grep
certainement plus facile avec grep,sed,awk
jpb@jpb-POWERMATE-VL280:~$ var='"total_results": 197, , ,xxx, yyyy';res1=$(echo ${var%%,*});res=$(echo ${res1##* });echo $res
197
jpb@jpb-POWERMATE-VL280:~$
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#6 Le 28/11/2018, à 16:15
- dje996
Re : [résolu] bash valeur après grep
merci Ar barzh paour
C'est bien se que pensait. Bash seul peut supprimer, couper, remplacer
Si l'on veut la sous-chaîne d'une chaîne. Il est obligatoire de couper autour de la sous-chaîne
Hors ligne
#7 Le 28/11/2018, à 16:39
- pingouinux
Re : [résolu] bash valeur après grep
Tu peux aussi utiliser tr, qui va garder tous les chiffres de la ligne (ou des lignes).
nbre=' "total_results": 197,'
tr -cd "0-9\n" <<<"$nbre"
Hors ligne
#8 Le 28/11/2018, à 17:17
- ar barzh paour
Re : [résolu] bash valeur après grep
C'est bien se que pensait. Bash seul peut supprimer, couper, remplacer
Si l'on veut la sous-chaîne d'une chaîne. Il est obligatoire de couper autour de la sous-chaîne
je m'apprêtais à répondre qu'on ne peut pas dire ça
on doit pouvoir utiliser les motifs mais je ne connais pas suffisamment , une boucle etc .....
et voir #7 de pingouinux ci-dessus
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#9 Le 28/11/2018, à 17:20
- Watael
Re : [résolu] bash valeur après grep
la regex qui va bien entre [[, et récupération dans BASH_REMATCH[]...
la flemme
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 28/11/2018, à 17:20
- ar barzh paour
Re : [résolu] bash valeur après grep
oui moi aussi
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#11 Le 28/11/2018, à 19:04
- dje996
Re : [résolu] bash valeur après grep
j'ai essayer les regex capturantes
nbre=' "total_results": 197,'
regex="results\": ([[:digit:]]*),"
[[ $nbre =~ $regex ]]
#echo "0) ${BASH_REMATCH[0]}"
echo "nombre) ${BASH_REMATCH[1]}"
titre='"title": "Les Animaux fantastiques : Les Crimes de Grindelwald",'
regex="itle\": \"([[:print:]]*)\","
[[ $titre =~ $regex ]]
#echo "0) ${BASH_REMATCH[0]}"
echo "titre ) ${BASH_REMATCH[1]}"
poster='"poster_path": "/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg",'
regex="path\": \"([[:print:]]*)\","
if [[ $poster =~ $regex ]] ; then
#echo "0) ${BASH_REMATCH[0]}"
echo " trouvé regex poster"
echo "poster) ${BASH_REMATCH[1]}"
else
echo " pas de regex"
fi
nombre) 197
titre ) Les Animaux fantastiques : Les Crimes de Grindelwald
trouvé regex poster
poster) /9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg
c'est pas mal je ne connaissait pas
par contre avec sed je n'y arrive pas avec les regex:
titre=$(sed -nr 's/.*"title": "*([0-9a-zA-Z :]+).*/\1/p' <<<"$resultat")
entre les 2 astérixis c'est avant le champ voulu
entre les 2 parenthèses c'est la chaîne voulu
et peut on précisé une chaîne de fin comme par exemple ' ", ' ?
Hors ligne
#12 Le 28/11/2018, à 19:34
- pingouinux
Re : [résolu] bash valeur après grep
par contre avec sed je n'y arrive pas avec les regex:
titre=$(sed -nr 's/.*"title": "*([0-9a-zA-Z :]+).*/\1/p' <<<"$resultat")
Que contient "$resultat" ?
Qu'est ce que tu obtiens ?
Qu'est-ce que tu voudrais obtenir ?
Hors ligne
#13 Le 28/11/2018, à 21:24
- dje996
Re : [résolu] bash valeur après grep
par exemple avec la variable:
poster='"poster_path": "/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg",'
je veux avoir
/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg
avec comme critère:
le début poster_path": "
et l’extension .jpg
et un autre exemple différent:
titre='"title": "Les Animaux fantastiques : Les Crimes de Grindelwald",'
je veux
Les Animaux fantastiques : Les Crimes de Grindelwald
avec les critères :
début "title": "
et fin ", qui n'est pas compris dans le résultat
j'ai fait ça, mais où dire s"arrêter avant ",
titre=$(sed -nr 's/.*"title": "*([[:print:]]*).*/\1/p' <<<"$resultat")
Hors ligne
#14 Le 28/11/2018, à 21:38
- pingouinux
Re : [résolu] bash valeur après grep
$ poster='"poster_path": "/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg",'
$ sed -nr 's/"poster_path": *"([^"]+)",$/\1/p' <<<"$poster"
/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg
$ titre='"title": "Les Animaux fantastiques : Les Crimes de Grindelwald",'
$ sed -nr 's/"title": *"([^"]+)",$/\1/p' <<<"$titre"
Les Animaux fantastiques : Les Crimes de Grindelwald
Ou même
$ sed -nr 's/"[^"]+": *"([^"]+)",$/\1/p' <<<"$poster"
/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg
$ sed -nr 's/"[^"]+": *"([^"]+)",$/\1/p' <<<"$titre"
Les Animaux fantastiques : Les Crimes de Grindelwald
Édité : Correction (commandes et résultats inversés)
Dernière modification par pingouinux (Le 03/12/2018, à 08:28)
Hors ligne
#15 Le 28/11/2018, à 22:04
- dje996
Re : [résolu] bash valeur après grep
merci pour ta réponse super rapide
je vais analyser tous ça
Hors ligne
#16 Le 08/01/2019, à 16:43
- MicP
Re : [résolu] bash valeur après grep
Bonjour
Avec les regex et BASH_REMATCH :
michel@debg53sw:~$ echo $mavar
poster='"poster_path": "/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg",'
michel@debg53sw:~$
michel@debg53sw:~$ debut='poster_path": "'
michel@debg53sw:~$ fin='.jpg'
michel@debg53sw:~$ maregex=''$debut'(.*'$fin')'
michel@debg53sw:~$
michel@debg53sw:~$ [[ $mavar =~ $maregex ]] && echo ${BASH_REMATCH[1]}
/9kC0guEMrYAXWN1sgNtY6ki1Gb8.jpg
michel@debg53sw:~$
michel@debg53sw:~$ echo $mavar
titre='"title": "Les Animaux fantastiques : Les Crimes de Grindelwald",'
michel@debg53sw:~$
michel@debg53sw:~$ debut='"title": "'
michel@debg53sw:~$ fin='",'
michel@debg53sw:~$ maregex=''$debut'(.*)'$fin''
michel@debg53sw:~$
michel@debg53sw:~$ [[ $mavar =~ $maregex ]] && echo ${BASH_REMATCH[1]}
Les Animaux fantastiques : Les Crimes de Grindelwald
michel@debg53sw:~$
Dernière modification par MicP (Le 08/01/2019, à 16:48)
Hors ligne