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 13/06/2013, à 20:49

vning

SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Bonjour,

je débute et rame un peu (voire beaucoup pour être honnête ...) avec SED

Ce que je cherche à faire :
dans un gros fichier texte je cherche à extraire des lignes comprises entre 1 motif de départ et 1 motif de fin. Ce qui est écrit entre le motif de départ et celui de fin varie en terme de longueur et de contenu.

Par exemple, un fichier "index.html", je veux trouver tous les liens html :

- motif de début "www.ubuntu.org"
- motif de fin ".html"
j'arrive à trouver le début de la séquence mais pas la partie variable puis la fin, avec la commande suivante :
sed -n 's/.*/http:\/\/www.testsite\.com\//p' index.html

Quelqu'un a t-il une piste ?

D'avance merci !


Nature is Master, Humankind its slave

Hors ligne

#2 Le 13/06/2013, à 20:52

pingouinux

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Bonsoir,
Peux-tu donner un exemple de fichier (en le réduisant éventuellement), et ce que tu veux en sortie.

Ajouté :
D'une manière générale, c'est :

sed -n '/motif1/,/motif2/p' fichier

Dernière modification par pingouinux (Le 13/06/2013, à 21:21)

Hors ligne

#3 Le 13/06/2013, à 22:07

vning

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Bonsoir,
un exemple serait le suivant :

<div id="page-layout">
    <div id="page-layout-content">
    <div id="eleven-header">
    <h3 class="accessible">Eleven Navigation</h3>
        <ul>
            <li class="btnEleven"><a href="http://eleven.com.au/home.htm">11</a></li>
            <li class="btnTop11"><a class="" href="http://eleven.com.au/top11.htm">Top11</a></li>
            <li class="btnTv"><a class="" href="http://eleven.com.au/tv.htm">Tv</a></li>
            <li class="btnMusic"><a class="" href="http://eleven.com.au/music.htm">Music</a></li>
            <li class="btnMovies"><a class="" href="http://eleven.com.au/movies.htm">Movies</a></li>
            <li class="btnGossip"><a class="" href="http://eleven.com.au/gossip.htm">Gossip</a></li>
            <li class="btnFunStuff"><a class="" href="http://eleven.com.au/fun-stuff.htm">Fun Stuff</a></li>
            <li class="btnShop"><a href="http://eleven.com.au/social.htm">Shop</a></li>
        </ul>
</div>

le motif de fin serait le "htm" plutôt que "html" pour le coup.

si je suis ton exemple avec la commande suivante :

sed -n '/http:\/\//,/htm/p' index.html

toutes les lignes contenant les 2 patterns sont extraites, alors que je voudrais ceci :
           http://eleven.com.au/home.htm
           http://eleven.com.au/top11.htm
           http://eleven.com.au/tv.htm
           http://eleven.com.au/music.htm
           http://eleven.com.au/movies.htm
           http://eleven.com.au/gossip.htm
           http://eleven.com.au/fun-stuff.htm
           http://eleven.com.au/social.htm

Dernière modification par vning (Le 13/06/2013, à 22:10)


Nature is Master, Humankind its slave

Hors ligne

#4 Le 13/06/2013, à 22:18

pingouinux

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

En fait, c'est peut-être ça que tu veux, sachant que les deux motifs sont sur la même ligne :

$ sed -nr 's/^.*"(http:\/\/.*\.htm)".*$/\1/p' fichier
http://eleven.com.au/home.htm
http://eleven.com.au/top11.htm
http://eleven.com.au/tv.htm
http://eleven.com.au/music.htm
http://eleven.com.au/movies.htm
http://eleven.com.au/gossip.htm
http://eleven.com.au/fun-stuff.htm
http://eleven.com.au/social.htm

Ajouté : Ou avec grep

$ grep -o 'http://.*\.htm' fichier
http://eleven.com.au/home.htm
http://eleven.com.au/top11.htm
http://eleven.com.au/tv.htm
http://eleven.com.au/music.htm
http://eleven.com.au/movies.htm
http://eleven.com.au/gossip.htm
http://eleven.com.au/fun-stuff.htm
http://eleven.com.au/social.htm

Dernière modification par pingouinux (Le 13/06/2013, à 22:28)

Hors ligne

#5 Le 13/06/2013, à 22:41

vning

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Chapeau ... !
C'est exactement ça  !

mais j'aimerais comprendre :
's --> substitution
^.* --> tous les caractères depuis le début de la ligne
"(http:\/\/.*\.htm)"--> une chaîne de caractère commençant par "http://", se terminant par ".htm" et n'importe quel caractère entre ces 2 chaînes ????.
*$ --> jusqu’à la fin de la ligne
/\1 --> je crois qu'il y a un lien avec les parenthèses ouvrante et fermante précédentes mais je ne vois pas le rôle.


Nature is Master, Humankind its slave

Hors ligne

#6 Le 13/06/2013, à 22:46

pingouinux

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Ce que tu indiques est correct, sauf :

.*$ --> jusqu’à la fin de la ligne
\1 --> Toute la ligne est remplacée par ce qui se trouve dans le 1er groupe de parenthèses (un seul groupe ici)

Hors ligne

#7 Le 13/06/2013, à 22:54

vning

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

c'est là ou je ne comprends pas la nuance entre l'opération demandée à sed : -s pour la substitution
et \1 --> Toute la ligne est remplacée par ce qui se trouve dans le 1er groupe de parenthèses (un seul groupe ici)

j'ai comme l'impression que ça fait double emploi ?


Nature is Master, Humankind its slave

Hors ligne

#8 Le 13/06/2013, à 23:02

pingouinux

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

vning   #7 a écrit :

j'ai comme l'impression que ça fait double emploi ?

On remplace : début_de_ligne(la_chaîne_qui_nous_intéresse)fin_de_ligne
par : la_chaîne_qui_nous_intéresse
qui est contenue dans \1

Hors ligne

#9 Le 13/06/2013, à 23:07

vning

Re : SED - Extraire chaine comprise entre 2 motifs, intégrant ces 2 motifs

Ok dit comme c'est clair !
Merci beaucoup smile
Sujet Clos


Nature is Master, Humankind its slave

Hors ligne