Ca va faire 2 jours que je me casse la tete sur google et ma console pour trouver comment faire, sans résultat
J’aimerais extraire certaines parties d’une page html (url, images, etc…) en bash en utilisant les expressions régulières, jusque là tout va bien tant que je m’en tiens au ligne par ligne, mais dès qu’il s’agit d’extraire quelque chose comme
<style>
blabla
</style>
ca bloque,
J’ai déjà essayé de passer par sed, mais je bloque toujours sur les sauts de ligne (je croit que le . n’inclut pas /n)
[ul]
[li]1 ça c’est mochecat monfichier.html|sed blalba
il vaut mieuxsed blalba monfichier.html[/li]
[li]page=$(cat monfichier.html)
echo $page | sed blabla
ça marche pas ?[/li][/ul]
[quote=“MisterFreez”][ul]
[li]1 ça c’est mochecat monfichier.html|sed blalba
il vaut mieuxcat monfichier.html|sed blalba
[/quote]
Il n’y a pas de différence dans ce que tu as écrit
[quote][/li]
[li]page=$(cat monfichier.html)
echo $page | sed blabla
ça marche pas ?[/li][/ul][/quote]
Ca fonctionne dans le sens où ca ne produit pas d’erreur, mais je n’ai pas le même résultat
Et j’ai remarqué que echo $page n’affiche pas la même chose qu’un cat mapage.html (me manque un petit bout du début et les retur à la ligne)
[quote=“japan445”][quote=“MisterFreez”][list]
[*]1 ça c’est mochecat monfichier.html|sed blalba
il vaut mieuxcat monfichier.html|sed blalba
[/quote]
Il n’y a pas de différence dans ce que tu as écrit[/quote]
C’est modifié.
En fait, tu ne passe pas les variables a sed mais à ton shell qui va les convertir en leur valeur pour les passer à sed.
En images:
$ cat > m
he
ho
du
ba
to
$ s=du; d=to;
$ echo "$s"
du
$ echo ‘$s’
$s
$ sed -n “/$s/,/$d/p” m
du
ba
to
$ sed -n ‘/$s/,/$d/p’ m
Les ’ empechent l’evaluation de $ par ton shell. Avec les " c’est ok.
page=$(cat monfichier.html)
echo $page | sed blabla
ça marche pas ?[/quote]
Ca fonctionne dans le sens où ca ne produit pas d’erreur, mais je n’ai pas le même résultat
Et j’ai remarqué que echo $page n’affiche pas la même chose qu’un cat mapage.html (me manque un petit bout du début et les retur à la ligne)[/quote]
J’avais aussi remarqué un autre problème par la suite, en faisant
page=$(cat monfichier.html)
echo $page
en plus des retours à la ligne, les /* (début de commentaire html, par ex) etaient interprétés et systématiquement remplacé pas la liste de mon repertoire racine
v445@445-laptop:~$ echo /*
/bin /boot /cdrom /dev /emul /etc /home /initrd.img /initrd.img.old /lib /lib32 /lib64 /lost+found /media /mnt /opt /proc /root /sbin /selinux /srv /sys /tmp /usr /var /vmlinuz /vmlinuz.old
après moult recherches, j’ai trouvé qu’il fallait mettre la variable entre guillemets (comme expliqué ici en anglais)
Donc finalement
page=$(cat monfichier.html)
echo "$page"|sed blabla
fonctionne à merveille (et les sauts de pages sont conservés lors de l’echo)
Sinon, dernière interrogation (j’espère) à tout hasard (je ne pense pas que ce soit possible, et c’est juste pour une question pratique) : est-il possible de séparet les résultats de sed dans un tableau ? Dans le cas où chaque correspondance est sur plusieurs ligne.
Un exemple sera plus clair :
v445@445-laptop:~/pingoo$ echo "$m"
a
bb
ccc
dddd
bb
a
dddd
a
bb
a
ccc
dddd
v445@445-laptop:~/pingoo$ echo "$m"|sed -n '/bb/,/dddd/p'
bb //début du résultat 1
ccc
dddd //fin résultat 1
bb // début 2
a
dddd //fin 2
bb //début 3
a
ccc
dddd //fin 3
Et donc faire un array de ces trois résultats. Mais à moins que sed ai une fonction pour ne donner que le premier, puis le deuxième, etc… je ne voit pas trop.
Je le ferai en perl. Sinon en awk, il y a la solution avec une variable qui vaut 1 quand on est dans le bloc a imprimer.
$ awk ‘/bb/{idn=1;}{if (idn==1) print;}/dddd/{idn=0;}’ << PAF
a
bb
ccc
dddd
bb
a
dddd
a
bb
a
ccc
dddd
PAF
bb
ccc
dddd
bb
a
dddd
bb
a
ccc
dddd