Contenu | Rechercher | Menus

Annonce

Ubuntu-fr vend de superbes t-shirts et de belles clés USB 32Go
Rendez-vous sur la boutique En Vente Libre

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 10/07/2020, à 12: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, à 14:13)

Hors ligne

#2 Le 10/07/2020, à 13: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, à 13:33)

Hors ligne

#3 Le 10/07/2020, à 13: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, à 13:52)


Le mot de passe sudo ne s'affiche pas
Comment bien utiliser les balises BBcode
LIBRARIES ARE NOT BOOK-STORES! − Une souris, des souris. Un souci, des soucis. Une énigme résolue, un problème résolu.
J’ai forké le compteur-couche-tard.

Hors ligne

#4 Le 10/07/2020, à 13: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

.

Voir https://stackoverflow.com/questions/173 … ained-tags

Hors ligne

#5 Le 10/07/2020, à 14:11

nany

Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier

sputnick a écrit :

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. wink


Le mot de passe sudo ne s'affiche pas
Comment bien utiliser les balises BBcode
LIBRARIES ARE NOT BOOK-STORES! − Une souris, des souris. Un souci, des soucis. Une énigme résolue, un problème résolu.
J’ai forké le compteur-couche-tard.

Hors ligne

#6 Le 10/07/2020, à 14:12

edboq

Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier

Merci toutes les solutions proposées font mon bonheur smile

Hors ligne

#7 Le 10/07/2020, à 14: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.

Hors ligne

#8 Le 10/07/2020, à 15: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

Hors ligne

#9 Le 10/07/2020, à 15: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, à 16: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.

Hors ligne

#11 Le 10/07/2020, à 16: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]}

Hors ligne

#12 Le 10/07/2020, à 17: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, à 18:13)


Welcome to sHell. · eval is evil.

En ligne

#13 Le 11/07/2020, à 14:41

edboq

Re : [RESOLU] Recupérer une valeur entre deux occurences dans un fichier

sputnick a écrit :

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, à 16: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 

-----

sputnick a écrit :

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, à 17: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.


Welcome to sHell. · eval is evil.

En ligne