#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
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
Sujet Clos
Nature is Master, Humankind its slave
Hors ligne