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 21/08/2019, à 15: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

hmm

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 ? smile

Dernière modification par Tutobenne (Le 21/08/2019, à 15:46)

Hors ligne

#2 Le 21/08/2019, à 15: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, à 16:45)


Archlinux sur Xiaomi Air 13

Hors ligne

#3 Le 21/08/2019, à 16:03

nany

Hors ligne

#4 Le 21/08/2019, à 16: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

sad

Dernière modification par Tutobenne (Le 21/08/2019, à 16:12)

Hors ligne

#5 Le 21/08/2019, à 16: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

Archlinux sur Xiaomi Air 13

Hors ligne

#6 Le 21/08/2019, à 16: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, à 16:31)

Hors ligne

#7 Le 21/08/2019, à 16: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, à 19:26)

Hors ligne

#8 Le 21/08/2019, à 18:03

Watael

Re : Utilisation de SED selon condition

cela me rappelle quelque chose...
--

nany a écrit :

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

Dernière modification par Watael (Le 21/08/2019, à 18:05)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 21/08/2019, à 19: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, à 19:31)


Archlinux sur Xiaomi Air 13

Hors ligne

#10 Le 21/08/2019, à 19: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, à 14:31

Tutobenne

Re : Utilisation de SED selon condition

Re,

@pingouinux : J'ai essayé, mais ça n'a pas l'air de fonctionner hmm
@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, à 14: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, à 15: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" sad
Une idée ?

Hors ligne

#14 Le 22/08/2019, à 15:54

nany

Re : Utilisation de SED selon condition

Tutobenne a écrit :

'$Z' est un fichier plat, un cat de la page html.

Je ne comprends toujours pas. hmm
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. wink

Hors ligne

#15 Le 22/08/2019, à 16:13

kamaris

Re : Utilisation de SED selon condition

Tutobenne a écrit :

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


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#17 Le 22/08/2019, à 16: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 sad

Hors ligne

#18 Le 22/08/2019, à 17:07

melixgaro

Re : Utilisation de SED selon condition

Bonjour,

Tutobenne a écrit :

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


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#19 Le 22/08/2019, à 17:47

kamaris

Re : Utilisation de SED selon condition

Tutobenne a écrit :

@kamaris :
Le saut de ligne n'est malheureusement pas pris en compte sad

Loin de moi l'idée de lui forcer la main.

Hors ligne

#20 Le 22/08/2019, à 18:03

nany

Re : Utilisation de SED selon condition

Tutobenne a écrit :

@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, à 18:03)

Hors ligne

#21 Le 22/08/2019, à 18: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, à 18:31)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#22 Le 22/08/2019, à 18:48

nany

Re : Utilisation de SED selon condition

Watael a écrit :

ça ressemble à une usine à gaz construite sur du sable cette histoire.

+42

Hors ligne

#23 Le 23/08/2019, à 11:24

Tutobenne

Re : Utilisation de SED selon condition

C'est bon ça marche enfin ! Merci à vous tous big_smile
Pour info j'ai opté pour la solution de kamaris.

Watael a écrit :

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

Dernière modification par Tutobenne (Le 23/08/2019, à 14:27)

Hors ligne