Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 sad

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 résolu, 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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

dje996 a écrit :

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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 cool


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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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

dje996 #11 a écrit :

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