Equivalent grep multiligne

Bonsoir !

Ca va faire 2 jours que je me casse la tete sur google et ma console pour trouver comment faire, sans résultat :slightly_smiling:

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)

Quelqu’un aurait il une solution pour moi ?

Un

devrait faire ton bonheur.

Pour info, grep fait du multiligne aussi, mais autour d’une seule expression. Cf

Effectivement, ca fait mon bonheur :smiley:

Mais maintenant j’ai un problème pour passer une variable à sed

fonctionne, mais au lieu de passer à sed le cat j’aimerais passer une variable dans laquelle il est contenu, comme

Et j’ai bien essayé plusieurs trucs mais aucun ne fonctionne,

Merci pour l’aide

[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)

Tu peux rajouter des « \n » à la fin de chaque ligne avec sed, pour que echo les prennent en compte (avec l’option -e) :

page=$(cat monfichier.html | sed 's/\$/\\n/g') echo -e $page | sed blabla

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

[quote=“japan445”]

[quote]

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)

@ignatioza : merci pour les précisions :slightly_smiling:

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.

Merci pour l’aide !

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