# Equivalent grep multiligne

**URL:** <https://www.debian-fr.org/t/equivalent-grep-multiligne/20891>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891 "2016-02-20T20:20:06Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![japan445](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/b5e925/32.png) [@japan445](https://www.debian-fr.org/u/japan445)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/1 "2016-02-20T20:20:06Z")

</div>

Bonsoir !

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)

Quelqu’un aurait il une solution pour moi ?

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/2 "2016-02-20T20:20:06Z")

</div>

Un

```auto

```

devrait faire ton bonheur.

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

```auto

```

---

<div class="post-metadata">

**Author:** ![japan445](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/b5e925/32.png) [@japan445](https://www.debian-fr.org/u/japan445)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/3 "2016-02-20T20:20:07Z")

</div>

Effectivement, ca fait mon bonheur 😃

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

```auto

```

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

```auto

```

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

Merci pour l’aide

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/4 "2016-02-20T20:20:08Z")

</div>

[ul]  
[li]1 ça c’est moche`cat monfichier.html|sed blalba`  
il vaut mieux`sed blalba monfichier.html`[/li]  
[li]`page=$(cat monfichier.html)
echo $page | sed blabla`  
ça marche pas ?[/li][/ul]

---

<div class="post-metadata">

**Author:** ![japan445](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/b5e925/32.png) [@japan445](https://www.debian-fr.org/u/japan445)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/5 "2016-02-20T20:20:12Z")

</div>

[quote=“MisterFreez”][ul]  
[li]1 ça c’est moche`cat monfichier.html|sed blalba`  
il vaut mieux`cat 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)

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/6 "2016-02-20T20:20:17Z")

</div>

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`

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/7 "2016-02-20T20:20:22Z")

</div>

[quote=“japan445”][quote=“MisterFreez”][list]  
[\*]1 ça c’est moche`cat monfichier.html|sed blalba`  
il vaut mieux`cat monfichier.html|sed blalba`  
[/quote]  
Il n’y a pas de différence dans ce que tu as écrit[/quote]  
C’est modifié.

---

<div class="post-metadata">

**Author:** ![ignatioza](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/i/41988e/32.png) [@ignatioza](https://www.debian-fr.org/u/ignatioza)\
**Post date:** [Février 20, 2016, 8:20 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/8 "2016-02-20T20:20:31Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![japan445](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/j/b5e925/32.png) [@japan445](https://www.debian-fr.org/u/japan445)\
**Post date:** [Février 20, 2016, 8:21 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/9 "2016-02-20T20:21:01Z")

</div>

[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](http://stackoverflow.com/questions/102049/how-do-i-escape-the-wildcard-asterisk-character-in-bash/104023#104023))

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 🙂

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 !

---

<div class="post-metadata">

**Author:** ![ignatioza](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/i/41988e/32.png) [@ignatioza](https://www.debian-fr.org/u/ignatioza)\
**Post date:** [Février 20, 2016, 8:22 UTC](https://www.debian-fr.org/t/equivalent-grep-multiligne/20891/10 "2016-02-20T20:22:00Z")

</div>

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
