#1 Le 10/07/2020, à 11:40
- edboq
[RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Bonjour,
Je viens poser une petite question que je n'arrive pas à résoudre.
Je souhaite récupérer une valeur dans un texte qui est systématiquement entre deux occurrences.
soit un fichier fichier.txt
<div Class="col-md-2 text-center"> </div> <div Class="col-md-3 vl-box"> <Span Class="vl-box-legend"> Valeur liquidative </Span><br /> <Span Class="vl-box-value"> 266,26 EUR </Span><br /> <Span Class="vl-box-date"> 09/07/2020 </Span> </div>
Je veux récupérer la valeur 266,26
Si je lance la commande
awk '/box-value">/,/EUR/' fichier.txt
ou
sed -n '/box-value/{:a;N;/EUR/!ba;p;}' fichier.txt
Je récupère comme valeur :
<Span Class="vl-box-value">
266,26 EUR
Or, je ne veux récupérer que la valeur 266,26.
Une commande simple peut-elle faire l'affaire ?
Merci d'avance pour vos lumières
Dernière modification par edboq (Le 10/07/2020, à 13:13)
Hors ligne
#2 Le 10/07/2020, à 12:30
- kamaris
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Sans avoir à se soucier des espaces, sauts de lignes, etc. dans fichier.txt, mais juste des balises :
gawk 'BEGIN{RS="\0"; FS="<Span Class=\"vl-box-value\">"} {for (i=2;i<=NF;i++) print gensub("[^0-9]*([0-9]+([.,][0-9]+)?).*","\\1",1,$i)}' fichier.txt
Par commodité, j'utilise gensub() qui est propre à gawk, mais si on voulait rester posix, on pourrait s'en passer.
Dernière modification par kamaris (Le 10/07/2020, à 12:33)
Hors ligne
#3 Le 10/07/2020, à 12:48
- nany
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Bonjour,
Et avec sed :
sed -n '/box-value/,+1{s/^[[:blank:]]*\(.*\) *EUR/\1/p}' fichier.txt
Ou bien avec grep :
grep -oP '\K[^ ].*(?= *EUR)' fichier.txt
Dernière modification par nany (Le 10/07/2020, à 12:52)
Hors ligne
#4 Le 10/07/2020, à 12:55
- sputnick
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Salut,
wow les codeurs, on ne parse pas du HTML/XML avec des regex ! Ces constructions sont vouées au bug et à l'erreur et à l'approximation.
Si vous voulez faire quelque chose de pro-propre, il faut utiliser un parser XML/HTML comme xmlstarlet ou xmllint.
xmllint --html --xpath '//div/span[@class="vl-box-value"]/text()' file.html
Sortie:
266,26 EUR
.
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#5 Le 10/07/2020, à 13:11
- nany
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
wow les codeurs, on ne parse pas du HTML/XML avec des regex ! Ces constructions sont vouées au bug et à l'erreur et à l'approximation.
Si vous voulez faire quelque chose de pro-propre, il faut utiliser un parser XML/HTML comme xmlstarlet ou xmllint.
Je suis entièrement d’accord, seulement on ne connaît pas les contraintes d’edboq (peut-il installer des paquets supplémentaires pour pouvoir utiliser xmlstarlet ou xmllint par exemple ?) donc on a fait avec ce qu’il proposait.
Hors ligne
#6 Le 10/07/2020, à 13:12
- edboq
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Merci toutes les solutions proposées font mon bonheur
Hors ligne
#7 Le 10/07/2020, à 13:27
- sputnick
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
On ne doit pas proposer des solutions de bricolage du dimanche.
Ensuite, les personnes copient collent ces réponses peuvent être amenées à devenir pro.
Et avoir ce genre de code en monde pro, ben faut tout réaprendre, car en production, on ne bidouille pas.
Si il y a HTML/XML et regex/awk/sed/grep dans la mème question, c'est une erreur de débutant.
'xmllint' est souvent installé par défaut avec Ubuntu.
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#8 Le 10/07/2020, à 14:04
- sputnick
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Si 'xmllint' n'est pas installé:
sudo apt install libxml2-utils
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#9 Le 10/07/2020, à 14:22
- MicP
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Bonjour
Il y a aussi la belle bibliothèque python Beautiful Soup
Hors ligne
#10 Le 10/07/2020, à 15:25
- sputnick
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Oui, mais pas besoin de python ici, un outil shell est suffisant.
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#11 Le 10/07/2020, à 15:29
- sputnick
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Une solution plus complète, pour enlever les espaces et 'EUR':
arr=( $(xmllint --html --xpath '//div/span[@class="vl-box-value"]/text()' file.html) )
echo ${arr[0]}
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#12 Le 10/07/2020, à 16:23
- Watael
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
read val reste < <(xmllint ...)
edit: et +1 pour xmllint
Dernière modification par Watael (Le 10/07/2020, à 17:13)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 11/07/2020, à 13:41
- edboq
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
Une solution plus complète, pour enlever les espaces et 'EUR':
arr=( $(xmllint --html --xpath '//div/span[@class="vl-box-value"]/text()' file.html) ) echo ${arr[0]}
Merci pour votre retour
moi pour avoir le chiffre je dois taper
echo ${arr[1]}
Hors ligne
#14 Le 12/07/2020, à 15:31
- LeoMajor
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
bonjour,
ce n'est même pas du pur xml ... mais du html
A/ tu peux utiliser lynx -dump qui enlève les balises (donc pas de code source)
:~$ awk 'BEGIN{FPAT="[0-9,]+"}/Valeur liquidative/{getline; print $NF}' < <(lynx -dump /tmp/foo.html )
266,26
B/ variante gambas
:~$ gbs3 -u gb.xml.html -e 'dim d as new xmldocument: d.open("/tmp/foo.html"): print d.root.getchildrenbyfilter("Span[Class*=vl-box-value]")[0].value'
266,26 EUR
l'histoire du [0] ou [1] dépend du nombres d'élements capturés dans la liste
:~$ gbs3 -u gb.xml.html -e 'dim d as new xmldocument: d.open("/tmp/foo.html"): for each e as xmlelement In d.root.getchildrenbyfilter("Span[Class*=vl-box]"):print e.value: next'
Valeur liquidative
266,26 EUR
09/07/2020
>
print d.root.getchildrenbyfilter("Span[Class*=vl-box]")[1].value renvoie 266,26 EUR
-----
On ne doit pas proposer des solutions de bricolage du dimanche.
Ensuite, les personnes copient collent ces réponses peuvent être amenées à devenir pro.
Et avoir ce genre de code en monde pro, ben faut tout réaprendre, car en production, on ne bidouille pas.
Si il y a HTML/XML et regex/awk/sed/grep dans la mème question, c'est une erreur de débutant.
'xmllint' est souvent installé par défaut avec Ubuntu.
Utopique et inadéquate.
Le forum s'adresse à tout la monde. Les professionnels ont la rubrique "ubuntu en entreprise", et ils peuvent poster partout .
Arrêtez de casser les pieds des gens avec vos principes. Il n'y a pas UNE solution, TA solution, mais DES solutions.
Hors ligne
#15 Le 12/07/2020, à 16:37
- Watael
Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier
on est censé apporter la meilleure solution (effectivement TMTOWTDI), pas la solution la plus moyenne (entends médiocre).
on est ici clairement pas avec Mme Michu qui veux ranger ses photos de vacances.
on le voit, avec un peu d'expérience, qu'il s'agit d'un exercice.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne