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 28/10/2014, à 19:32

Yoannjap

[Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

Bonsoir tout le monde,

Je suis en train d'écrire un script de récupération des métatadonnées des images wikicommons pour les afficher sous un format html unique. Bref, j'apprends surtout le scriptage bash depuis quelques mois, lentement.
Mais là, je bute sur un truc simple (certainement) :

J'ai une variable « $AUTHOR » qui doit rechercher les infos sur le peintre, photographe ou auteur du fichier image. (pour ceux que ça intéresse, AUTHOR=wget -q -O - $1 | sed -n '/"fileinfo-paramfield">Author<\/td>/{n;p}' | sed 's/.*<td>//' | sed 's/<\/td>.*//' | sed 's/^[ \t]*//;s/[ \t]*$//' | sed '$!N; /^\(.*\)\n\1$/!P; D'`")

Mais lorsque je fais

echo $AUTHOR

, mon terminal m'affiche toujours l'ensemble d'une ligne (logique, c'est ce que je lui demande avec wget).
Exemple de ce que cela donne (l'alias de mon script est la commande « wkm2 » :

wkm2 http://commons.wikimedia.org/wiki/File:Olympic_Oval.jpg
<a href="//en.wikipedia.org/wiki/User:[b]Ardo191[/b]" class="extiw" title="en:User:Ardo191">en:User:Ardo191</a>

Moi, ce que je souhaite, c'est juste qu'il m'affiche « Ardo 191 », soit seuelement le nom de l'auteur. Et là j'ai écumé internet, et avec mon niveau, je n'ai pas trouvé de solution, ou plutôt, la moitié. En effet, si je crée une nouvelle variable, pour enlever ce qui précède le nom de l'auteur, il faut faire :

AUTHORsansledébut="${AUTHOR#*User:}"

en effet avec

echo $AUTHORsansledébut

j'obtiens :

Ardo191" class="extiw" title="en:User:Ardo191">en:User:Ardo191</a>

Mais... comment écrire la variable « AUTHORsansledébut » pour enlever ce qui suit Ardo191 ?


Merci BEAUCOUP pour votre aide !

Hors ligne

#2 Le 28/10/2014, à 19:51

pingouinux

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

Bonjour,
Essaye ceci :

AUTHOR=$( wkm2 http://commons.wikimedia.org/wiki/File:Olympic_Oval.jpg | grep -Po '(?<=\[b]).*(?=\[/b])' )

Hors ligne

#3 Le 28/10/2014, à 19:54

Yoannjap

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

Et comme par magie j'écris un post pour demander : « à l'aide », et c'est bien sûr à ce moment que je tombre (presque) par hasard sur LA soluton big_smile
Pour ceux que ça pourrait comme moi aider dans les début de bac à sable de Sed,
pour enlever ce qu'il y a après Ardo191, il suffit faire ceci :

AUTHORsansledébutnilafin="${AUTHORsansledébut%%\"*}"

(l'antislash étant là pour ne pas que le script interprête le signe " comme spécial).

Donc en tout ça fait (oui, cette solution est une soluce de débutant, mais j'assume smile)

#!/bin/bash

url=$1
AUTHOR2="`wget -q -O - $1 | sed -n '/"fileinfo-paramfield">Author<\/td>/{n;p}' | sed 's/.*<td>//' | sed 's/<\/td>.*//' | sed 's/^[ \t]*//;s/[ \t]*$//' | sed '$!N; /^\(.*\)\n\1$/!P; D'`" # {n;p} 

echo $AUTHOR
<a href="//en.wikipedia.org/wiki/User:Ardo191" class="extiw" title="en:User:Ardo191">en:User:Ardo191</a>
echo $AUTHORsansledébut
Ardo191" class="extiw" title="en:User:Ardo191">en:User:Ardo191</a>
AUTHORsansledébutnilafin="${AUTHORsansledébut%%\"*}"
echo $AUTHORsansledébutnilafin
Ardo191

Hors ligne

#4 Le 30/10/2014, à 10:34

nesthib

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

Je crois que je t'avais déjà encouragé à utiliser un langage un peu plus facile pour faire des scripts, comme python. Je t'encourage aussi à utiliser les API de wikimedia commons, ça te facilitera grandement ta tâche.

Un exemple en python :

import urllib2
from BeautifulSoup import BeautifulSoup

URL = 'https://commons.wikimedia.org/w/api.php?action=query&prop=imageinfo&iiprop=extmetadata&format=xml&titles=Image:%s'

data = BeautifulSoup(urllib2.urlopen(URL % "Olympic_Oval.jpg"))
art_val = data.find('artist')['value']
if art_val:
    art_soup = BeautifulSoup(art_val)
    print(art_soup.a.text.rsplit(':', 1)[-1])

Et tu peux récupérer en une fois tout un tas d'informations sur ton fichier.

NB. l'exemple est très simplifié, en pratique il faudrait faire quelques tests pour vérifier que les champs existent wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 30/10/2014, à 11:30

Spirale21

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

alors je ne critique pas le fond mais la forme.

  • AUTHORsansledébutnilafin c'est laid (bon opinion perso) et j'ai dû le lire deux fois pour me rendre compte que ct une phrase alors pour nommer tes variables il y a deux écoles (à ma connaissance):
      -l'école du C : author_sans_le_debut_ni_la_fin (pas d'accent tout en minuscule les majuscules sont réservés aux constantes, les minuscules pour les variables)
      -l'école java: AuthorSansLeDebutNiLaFin avec une majuscule au début de chaque mot
    après choisir est une question de goût mais ça a l'avantage d'être plus explicite (on ne change pas d'école en cours de route).

  • C'est quand même long des nom de variables (mais explique...bon point)..

  • Essayes de bannir les accents et les caractères spéciaux de tes variables: en gros ne prend que des caractères du code ASCII (même si normalement tout le monde travaille en UTF-8)

  • Rajoutes des commentaires ça peut aider:Si tu reprends ton programme  pour l'optimiser tu sauras de quoi il s'agit (au premier coup d’œil)

  • Ce n'est pas un copier/coller de ton code car la variable $AUTHOR n'est pas défini, tu définis la variable $AUTHOR2

  • Regarde si l'option -e de sed pourrait pas t'aider ?

  • J'aime pas le python (nesthib smile )

Sinon bravo pour ton programme qui fonctionne, ne prends pas ses "critiques" pour te dévaloriser ou pour te montrer du doigt. Je faisais les mêmes au début et voire pire (enfin je te passe les détails) mais en regardant un de mes premiers programmes tu pourrais rire tellement il est mal fichu..


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#6 Le 30/10/2014, à 17:41

nesthib

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

@Spirale21 : python ou pas, ma remarque a surtout pour but de l'encourager à ne pas faire une telle suite de sed, c'est vraiment très maladroit. Il faut qu'il utilise l'API mediawiki, ça lui évitera déjà de parser du html.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#7 Le 30/10/2014, à 23:00

Spirale21

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

oui je me doutais que ct pour l'API c vrai que plein de sed c pas très joli mais il débute moi j'ai fait pareil et j'étais trop content qu'il marche mon programme même si rétrospectivement le programme était un peu bancal pas optimisé.... bref tout les qualificatifs que tu veux et les API je m'en fichait de réinventer la roue ct moi qu'il avait fait!!!
Le prends pas mal pour Python je sais pas un langage ou l'indentation fait office de délimiteur de blocs ça me fait peur (après il est sûrement très puissant) main tenant si tu me dit que je peux utiliser des { } je l'apprends demain...


il y a trois manière de faire: la bonne, la mauvaise et la mienne

Hors ligne

#8 Le 31/10/2014, à 19:33

Hizoka

Re : [Bash script] Sed, comment supprimer qqch APRÈS une variable :) ?

et en un chouille plus simple qui marche pour ton exemple :

wget -q -O - http://commons.wikimedia.org/wiki/File:Olympic_Oval.jpg | sed -n "/\/wiki\/User:/ s@.*User:\([^<]*\).*@\1@p" | sed -n "1p"

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne