Contenu | Rechercher | Menus

Annonce

L'équipe des administrateurs et modérateurs du forum vous souhaite d'excellentes fêtes de fin d'année !

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:~$ 

Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

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


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

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


eval, c'est mal.

Hors ligne

#10 Le 28/11/2018, à 17:20

ar barzh paour

Re : [résolu] bash valeur après grep

oui moi aussi


Ubuntu 18.04 (sept 2018) (était en essai depuis 12/2017)
Ubuntu 16.04 (07/2016) et diverses versions  Ubuntu 14.04 ,  Studio 14.04 LTS 64 bits , MATE 16.04
PC          : Intel(R) Pentium(R) CPU G4600 @ 3.60GHz  + 4GiB RAM DDR4-2400
Portable : Intel(R) Core(TM)2  Duo CPU     T5750  @ 2.00GHz 3Go de RAM DDR2 667 Mhz Ubuntu 18.04

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