#1 Le 15/04/2010, à 19:09
- wlourf
[résolu bash] extraire chaîne accentuée
Bonjour,
Je chercher à récupérer quelques infos de cette page : http://sites.radiofrance.fr/chaines/fip/endirect/popprog.php?first=0 (la programmation qui est diffusée sur FIP) pour l'afficher dans un conky.
En fait tout ce que je veux se trouve sur cette ligne (Artiste, Album, Titre, Label, Année):
<td BGCOLOR="#ED1A3B" CLASS="blanc11"><SPAN CLASS="txt"><B> BRAD MEHLDAU</B> THE FALCON WILL FLY AGAIN</SPAN><br><IMG SRC="http://image.radio-france.fr/img/vide.gif" WIDTH="4"><br>Album : HIGHWAY RIDER<br>Label : NONESUCH<br>Année : 2010</td>
Mon problème est que je n'arrive pas à extraire l'année, sans doute à cause de l'accent ... heureusement, tout le reste est en majuscules
Voici le script, si vous avez une idée ce n'est peut être pas la meilleure façon de faire pour l'extraction, vaut-il mieux passer par un cut? :
#! /bin/bash
#usage :
#./get-fip.sh W
#écrit les infos artiste, titre, album, label, année dans un fichier fileOut
##
#./get-fip.sh R n
#lit les infos du fichier créé précedemment n est la ligne à lire
fileTmp="/tmp/get-fip.txt"
fileOut="/tmp/info-fip.txt"
imgCover="/tmp/fip-cover"
urlInfos="http://sites.radiofrance.fr/chaines/fip/endirect/popprog.php?first=0"
urlCover="http://players.tv-radio.com/radiofrance/pochettes/fipRSS.html"
function extract {
a=$(($(expr "$line_txt" : ".*$begin")))
b=$(($(expr "$line_txt" : ".*$end")-$a-${#end}))
echo ${line_txt:$a:$b}
}
if [ "$1" == "W" ]; then
rm -f $fileOut
GET $urlInfos > $fileTmp
#match="<td BGCOLOR=\"#ED1A3B\" CLASS=\"blanc11\"><SPAN CLASS=\"txt\">"
line_txt=`cat $fileTmp.utf8 | grep "td BGCOLOR=\"#ED1A3B\""`
if [[ "$line_txt" == "" ]]; then
echo "Pas d'info FIP..."
exit
fi
begin="<B>"
end="</B>"
artist=$(extract)
begin=$end
end="</SPAN>"
title=$(extract)
begin="Album :"
end="<br>Label"
album=$(extract)
begin="Label :"
end="<br>Ann"
label=$(extract)
begin="e : "
end="</td>"
#year=""
year=$(extract) #-->problème avec l'année
if [ "$title" == "PROGRAMME FIP" ]; then
artist=""
album=""
label=""
year=""
fi
echo
#echo $line_txt #<=== ligne à commenter pour utiliser avec le conky
echo
echo $artist > $fileOut
echo $title >> $fileOut
echo $album >> $fileOut
echo $label >> $fileOut
echo $year >> $fileOut
fi
if [ "$1" == "R" ]; then
i=0
if [ ! -f $fileOut ]; then
echo "Pas de fichier "$fileOut
else
while read line
do
if [ "$i" == "$2" ]; then
echo $line
fi
i=$(( $i + 1 ))
done < $fileOut
fi
fi
Au final, ça devrait donner ça, l'année serait donc un petit plus !
Merci d'avance ...!
Dernière modification par wlourf (Le 15/04/2010, à 20:59)
Hors ligne
#2 Le 15/04/2010, à 20:01
- toto2006
Re : [résolu bash] extraire chaîne accentuée
salut ,
si c'est un pb d'accent tu peux utiliser iconv pour convertir en utf8 (voir man iconv ) genre :
urlInfos="http://sites.radiofrance.fr/chaines/fip/endirect/popprog.php?first=0"
GET $urlInfos > ./fileTmp
iconv -f iso-8859-1 -tutf8 fileTmp > fileTmp.utf8
sinon j'ai pas trop le tps de regarder le code mais on dois pouvoir optimiser un peu je pense
Hors ligne
#3 Le 15/04/2010, à 20:57
- wlourf
Re : [résolu bash] extraire chaîne accentuée
Super, ça marche très bien, j'en ai profité pour remplacer la boucle qui cherche la ligne qui va bien par ceci :
line_txt=`cat $fileTmp.utf8 | grep "td BGCOLOR=\"#ED1A3B\""`
Pour le reste, je ne vais pas trop y toucher pour l'instant, sauf si vous me soufflez des idées
En tout cas merci, l'année s'affiche bien!
Hors ligne
#4 Le 15/04/2010, à 21:25
- AnsuzPeorth
Re : [résolu bash] extraire chaîne accentuée
Bjr,
Tu peux utiliser une ER
eval $(sed -n '69s@.*CLASS="txt"><B> \(.*\)</B> \(.*\)</SPAN>.*Album : \(.*\)<br>Label : \(.*\)<br>Ann.* : \(.*\)</td>@artist="\1" title="\2" album="\3" label="\4" year="\5"@p' < <(wget http://sites.radiofrance.fr/chaines/fip/endirect/popprog.php?first=0 -O- | iconv -f iso-8859-1 -t utf8))
echo $arstist $title $album $label $year
C'est pas très propre ... Cela peut être amélioré
ps: je récupère la ligne 69, normalement elle ne devrait pas bouger !
Dernière modification par AnsuzPeorth (Le 15/04/2010, à 21:26)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#5 Le 16/04/2010, à 01:09
- wlourf
Re : [résolu bash] extraire chaîne accentuée
Bjr,
Tu peux utiliser une EReval $(sed -n '69s@.*CLASS="txt"><B> \(.*\)</B> \(.*\)</SPAN>.*Album : \(.*\)<br>Label : \(.*\)<br>Ann.* : \(.*\)</td>@artist="\1" title="\2" album="\3" label="\4" year="\5"@p' < <(wget http://sites.radiofrance.fr/chaines/fip/endirect/popprog.php?first=0 -O- | iconv -f iso-8859-1 -t utf8)) echo $arstist $title $album $label $year
C'est pas très propre ... Cela peut être amélioré
ps: je récupère la ligne 69, normalement elle ne devrait pas bouger !
humpf, un peu trop violente pour moi cette ligne !
Hors ligne
#6 Le 16/04/2010, à 03:02
- AnsuzPeorth
Re : [résolu bash] extraire chaîne accentuée
humpf, un peu trop violente pour moi cette ligne !
Comme c'était pour conky, donc refresh régulier, je pensais que tu voulais une commande assez rapide (en tout cas un peu plus rapide que ton script !); Je pense qu'on faire mieux avec awk , mais je ne maitrise pas du tout ...
Sinon, c'est pas si compliqué !
C'est juste une commande sed :
sed -n '69p' < <(wget .....) → affichera la ligne 69 du téléchargement.
sed 's@TOTO@TATA@' <<< $var → remplace TOTO par TATA dans la variable $var
sed 's@du texte \(.*\) suite de texte@\1@' <<< $var → \(.*\) pattern à récupérer, \1 rappel du pattern.
donc pour var='du texte voila le pattern suite de texte', le résultat de la commande précédante sera voila le pattern
j'ai mis un eval devant la commande complète, car j'ai fait un rappel de pattern artist="\1", comme ça les variables sont chargées directement ! Il serait possible de juste afficher le resultat avec saut de ligne, cela pourrait être utiliser direct dans conky, sans passer par un script.
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#7 Le 18/04/2010, à 11:58
- wlourf
Re : [résolu bash] extraire chaîne accentuée
Merci pour ces explications, j'ai essayé de les essayer sur ce post : http://forum.ubuntu-fr.org/viewtopic.php?pid=3410644#p3410644 mais sans succès pour l'instant
Dernière modification par wlourf (Le 18/04/2010, à 11:59)
Hors ligne