#1 Le 21/08/2019, à 14:37
- Tutobenne
Utilisation de SED selon condition
Bonjour à tous,
Je vous expose mon problème.
Je dois chaque jour, via un script, me connecter à un serveur pour récupérer du contenu.
La page sur laquelle je me connecte se présente sous cette forme :
<tr><td><a href='https://www.test.com/truc1.xlsx' target='_blank'>fichier1.xml</a></tr>
<tr><td><a href='https://www.test.com/truc2.pdf' target='_blank'>truc2.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 3.pdf' target='_blank'>truc bidule 3.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 4.pdf' target='_blank'>truc bidule 4.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 5.pdf' target='_blank'>truc bidule 5.pdf</a></tr>
Ci-dessus dans mon exemple, on remarque que je dois parfois récupérer du contenu via une URL contenant des espaces, qui est vu comme des sauts de ligne cependant.
Pour parer cela, j'ai commencé par ajouter cette ligne à mon script :
for fichier in $Z
do
echo "$fichier" | tr '\n' '%' | sed -e 's/'%'/'%20'/g'
done
# Ici je remplace donc mes sauts de ligne('\n') par '%' puis mes '%' par '%20' afin que l'url soit accessible (je n'arrive pas à remplacer directement '\n' par '%20' ...
Où $Z est la liste que j'ai récupéré sur le site, dans mon exemple ce serait :
https://www.test.com/truc1.xlsx
https://www.test.com/truc2.xlsx
Etc ...
Cependant, désormais j'obtiens ceci :
https://www.test.com/truc%20bidule%203.pdf%20https://www.test.com/truc%20bidule%204.pdf%20https://www.test.com/truc%20bidule%205.pdf%20
Au lieu d'un truc propre :
https://www.test.com/truc%20bidule%203.pdf
https://www.test.com/truc%20bidule%204.pdf
https://www.test.com/truc%20bidule%205.pdf
Plusieurs problèmes se posent alors. Ce que j'obtiens en l'état est inutilisable car :
- Il faudrait que je puisse - après l'extension .pdf, .pptx ou .xlsx - activer le saut de ligne
- Et ne pas avoir de '%20' à la fin de ma dernière ligne (ou plutôt après chaque ligne)
J'espère avoir été explicite ... Auriez-vous des pistes ?
Dernière modification par Tutobenne (Le 21/08/2019, à 14:46)
Hors ligne
#2 Le 21/08/2019, à 14:56
- k3c
Re : Utilisation de SED selon condition
utilise un parser HTML de préférence à sed pour ce genre de travail
en Python
BeautifulSoup
lxml
et plein d'autres
Dernière modification par k3c (Le 21/08/2019, à 15:45)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#3 Le 21/08/2019, à 15:03
- nany
Re : Utilisation de SED selon condition
Bonjour,
+1 pour python.
Sinon :
cat "$Z" | sed 's/ /%20/g'
Hors ligne
#4 Le 21/08/2019, à 15:11
- Tutobenne
Re : Utilisation de SED selon condition
Salut (Super)nany, k3c,
Effectivement il serait plus simple et plus judicieux de passer par autre chose que du SHELL, mais c'est une contrainte que j'ai ...
J'ai essayé ta solution, à savoir directement faire un cat sur $Z, mais j'obtiens :
truc1.xlsx
truc2.pdf
truc
bidule
3.pdf
truc
bidule
4.pdf
truc
bidule
5.pdf
Dernière modification par Tutobenne (Le 21/08/2019, à 15:12)
Hors ligne
#5 Le 21/08/2019, à 15:24
- k3c
Re : Utilisation de SED selon condition
peut-être (pas essayé), prendre avec grep -Po ce qu'il y a entre 2 chaines
grep -Po '(?<=a href).*(?=target)' $Z
Debian 12 sur Thinkpad reconditionné
Hors ligne
#6 Le 21/08/2019, à 15:29
- nany
Re : Utilisation de SED selon condition
Alors là, il faudrait que tu nous en montre plus de ton script (notamment comment est renseignée la variable Z) pour qu’on y voit plus clair.
Dernière modification par nany (Le 21/08/2019, à 15:31)
Hors ligne
#7 Le 21/08/2019, à 15:55
- pingouinux
Re : Utilisation de SED selon condition
Bonjour,
Essaye
sed -r "s/.*(https:[^']+).*/\1/;s/ /%20/g" "$Z"
Ajouté : Je suppose que Z contient le nom du fichier à traiter
Dernière modification par pingouinux (Le 21/08/2019, à 18:26)
Hors ligne
#8 Le 21/08/2019, à 17:03
- Watael
Re : Utilisation de SED selon condition
cela me rappelle quelque chose...
--
Alors là, il faudrait que tu nous en montre plus de ton script (notamment comment est renseignée la variable Z) pour qu’on y voit plus clair.
+1
une "variable plate" pour stocker une liste, au lieu d'une variable liste (aka un tableau), c'est évidemment très moyen.
Dernière modification par Watael (Le 21/08/2019, à 17:05)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 21/08/2019, à 18:30
- k3c
Re : Utilisation de SED selon condition
le programme Python qui fait cela n'est pas bien long
gg@gg-UX305UA:~$ cat a.html
<tr><td><a href='https://www.test.com/truc1.xlsx' target='_blank'>fichier1.xml</a></tr>
<tr><td><a href='https://www.test.com/truc2.pdf' target='_blank'>truc2.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 3.pdf' target='_blank'>truc bidule 3.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 4.pdf' target='_blank'>truc bidule 4.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 5.pdf' target='_blank'>truc bidule 5.pdf</a></tr>
gg@gg-UX305UA:~$ python sed.py
https://www.test.com/truc1.xlsx
https://www.test.com/truc2.pdf
https://www.test.com/truc bidule 3.pdf
https://www.test.com/truc bidule 4.pdf
https://www.test.com/truc bidule 5.pdf
gg@gg-UX305UA:~$ cat sed.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
with open("a.html","r") as f:
html = f.read()
soup = BeautifulSoup(html,"lxml")
tags = soup('a')
for tag in tags:
print tag['href']
gg@gg-UX305UA:~$
Dernière modification par k3c (Le 21/08/2019, à 18:31)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#10 Le 21/08/2019, à 18:55
- nany
Re : Utilisation de SED selon condition
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
with open("a.html","r") as f:
html = f.read()
soup = BeautifulSoup(html,"lxml")
for a in soup.find_all('a', href=True):
url = a['href'].replace(' ','%20')
print url
Hors ligne
#11 Le 22/08/2019, à 13:31
- Tutobenne
Re : Utilisation de SED selon condition
Re,
@pingouinux : J'ai essayé, mais ça n'a pas l'air de fonctionner
@Watael : Effectivement c'est moi aussi ^^
@k3c et @nany : Je comprends bien et je suis même plutôt d'accord qu'utiliser une autre méthode (python par exemple) serait bien plus judicieux, mais c'est une contrainte que j'ai de passer uniquement par du shell ...
Hors ligne
#12 Le 22/08/2019, à 13:39
- nany
Re : Utilisation de SED selon condition
Si la contrainte est de faire en bash, alors la problématique est toujours la même : comment est renseignée la variable Z ?
Hors ligne
#13 Le 22/08/2019, à 14:39
- Tutobenne
Re : Utilisation de SED selon condition
'$Z' est un fichier plat, un cat de la page html.
A côté, j'ai peut être un début de solution à mon problème.
En partant de ce résultat :
https://www.test.com/truc%20bidule%203.pdf%20https://www.test.com/truc%20bidule%204.pdf%20https://www.test.com/truc%20bidule%205.pdf%20
J'ai décider de traiter ce résultat comme un fichier temp.
Et donc, à partir de celui-ci, il me faudrait pouvoir remplacer les ".format%20" par ".format[saut_de_ligne]" ...
Donc je me suis lancé dans un truc du genre :
$fichier| sed -e 's/'.pdf%20'/'.pdf\n'/g' | sed -e 's/'.xlsx%20'/'.xlsx\n'/g' | sed -e 's/'.pptx%20'/'.pptx\n'/g'
Le problème c'est que mon "\n" est interprété comme un "n"
Une idée ?
Hors ligne
#14 Le 22/08/2019, à 14:54
- nany
Re : Utilisation de SED selon condition
'$Z' est un fichier plat, un cat de la page html.
Je ne comprends toujours pas.
Est-ce que $Z contient ça :
<tr><td><a href='https://www.test.com/truc1.xlsx' target='_blank'>fichier1.xml</a></tr>
<tr><td><a href='https://www.test.com/truc2.pdf' target='_blank'>truc2.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 3.pdf' target='_blank'>truc bidule 3.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 4.pdf' target='_blank'>truc bidule 4.pdf</a></tr>
<tr><td><a href='https://www.test.com/truc bidule 5.pdf' target='_blank'>truc bidule 5.pdf</a></tr>
ou ça :
https://www.test.com/truc1.xlsx
https://www.test.com/truc2.pdf
https://www.test.com/truc bidule 3.pdf
https://www.test.com/truc bidule 4.pdf
https://www.test.com/truc bidule 5.pdf
Ça serait quand même plus simple à comprendre si tu nous montrais ton script.
Hors ligne
#15 Le 22/08/2019, à 15:13
- kamaris
Re : Utilisation de SED selon condition
En partant de ce résultat :
https://www.test.com/truc%20bidule%203.pdf%20https://www.test.com/truc%20bidule%204.pdf%20https://www.test.com/truc%20bidule%205.pdf%20
Si ceci est bien le contenu de la variable Z (après que son contenu d'origine a subi divers traitements), quand tu en es là, tu fais
Z=${Z%\%20}
Z=${Z//%20https/$'\n'https}
et ça devrait te remettre d'aplomb. Pour vérifier :
echo "$Z"
(ne pas oublier les guillemets)
Hors ligne
#16 Le 22/08/2019, à 15:44
- Watael
Re : Utilisation de SED selon condition
mapfile -t Z <fichierPlat
et hop ! on a un tableau.
for f in "${Z[@]// /%20}"; do : whatever with "$f"; done
et hop ! plus d'espaces lors du traitement des membres du tableau.
Dernière modification par Watael (Le 22/08/2019, à 17:26)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 22/08/2019, à 15:46
- Tutobenne
Re : Utilisation de SED selon condition
@nany :
ahah on va y arriver !
$Z =
https://www.test.com/truc1.xlsx
https://www.test.com/truc2.pdf
https://www.test.com/truc bidule 3.pdf
https://www.test.com/truc bidule 4.pdf
https://www.test.com/truc bidule 5.pdf
@kamaris :
Le saut de ligne n'est malheureusement pas pris en compte
Hors ligne
#18 Le 22/08/2019, à 16:07
- melixgaro
Re : Utilisation de SED selon condition
Bonjour,
Ci-dessus dans mon exemple, on remarque que je dois parfois récupérer du contenu via une URL contenant des espaces, qui est vu comme des sauts de ligne cependant.
C'est peut-être ça qu'il faudrait corriger en premier, non ?
Je ne vois pas pourquoi des espaces dans une page html deviendraient des sauts de ligne. Comment obtiens-tu ta page html ?
(Ou alors ce sont vraiment des sauts de ligne et dans ce cas, il ne faut pas les remplacer par %20.)
Ajout : et comment assignes-tu la variable Z (comment passe-tu du html pur à la variable Z) ?
Dernière modification par melixgaro (Le 22/08/2019, à 16:09)
Linux depuis ~2007. Xubuntu seulement.
Hors ligne
#19 Le 22/08/2019, à 16:47
- kamaris
Re : Utilisation de SED selon condition
@kamaris :
Le saut de ligne n'est malheureusement pas pris en compte
Loin de moi l'idée de lui forcer la main.
Hors ligne
#20 Le 22/08/2019, à 17:03
- nany
Re : Utilisation de SED selon condition
@nany :
ahah on va y arriver !
$Z =https://www.test.com/truc1.xlsx https://www.test.com/truc2.pdf https://www.test.com/truc bidule 3.pdf https://www.test.com/truc bidule 4.pdf https://www.test.com/truc bidule 5.pdf
Alors, c’est tout simple :
echo "$Z" | sed 's/ /%20/g'
Bien mettre $Z entre guillemets.
Dernière modification par nany (Le 22/08/2019, à 17:03)
Hors ligne
#21 Le 22/08/2019, à 17:25
- Watael
Re : Utilisation de SED selon condition
bof, autant appliquer sed sur le fichier plat :
while read -r filename; do : whatever with "$filename"; done < <(sed 's/ /%20/g' fichierHTML)
et hop! pas d'UUOC (« '$Z' est un fichier plat, un cat de la page html. »).
mais bon, j'ai montré en #16 comment se passer de sed.
ça ressemble à une usine à gaz construite sur du sable cette histoire. 8O
à force de faire petit bout par petit bout, ça va pas tenir debout très longtemps...
Dernière modification par Watael (Le 22/08/2019, à 17:31)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 22/08/2019, à 17:48
- nany
Re : Utilisation de SED selon condition
ça ressemble à une usine à gaz construite sur du sable cette histoire.
+42
Hors ligne
#23 Le 23/08/2019, à 10:24
- Tutobenne
Re : Utilisation de SED selon condition
C'est bon ça marche enfin ! Merci à vous tous
Pour info j'ai opté pour la solution de kamaris.
ça ressemble à une usine à gaz construite sur du sable cette histoire.
J'suis entièrement d'accord avec toi ^^ Malheureusement je reprends un travail qui à été un peu bâclé, et où l'on m'impose de bosser en Shell ... C'est plus une solution de dépannage pour pouvoir ensuite prendre le temps de tout remettre au propre !
En tout cas, encore merci à tous
Dernière modification par Tutobenne (Le 23/08/2019, à 13:27)
Hors ligne