Forum Programmation.shell Sed

Posté par  .
Étiquettes : aucune
0
16
fév.
2010
salut,

un petit problème tout bête :

j'essaie d'extraire des url d'une page en utilisant sed mais je suis confronté à un problème.
J'arrive bien à récupérer le début de l'url mais pas la fin :

extraire le début : [OK]


moa@oam ~$ cat page.html |grep /truc/m | sed 's/^.*adressedusite//'
/fr/bidule/truc/machin_45203.html">blah
/fr/bidule/truc/machin_45203.html" class="lire" title="lire">Lire

extraire la fin : [NOK]

moa@oam ~$ cat page.html |grep /truc/m | sed 's/^.*adressedusite//' | sed 's/\(^.*\)\(".*\)/\1/'
/fr/bidule/truc/machin_45203.html
/fr/bidule/truc/machin_45203.html" class="lire" title="lire


En fait, il ne coupe qu'à partir du dernier " ...
une idée ?
  • # uurk

    Posté par  (site web personnel) . Évalué à 3.

    deux sed, c'est pas super joli... déja tu peux faire ça en one shot. ensuite, sed n'est pas forcément la meilleure solution...

    essais de penser à ce que tu veux récupérer et à partir de quoi.


    sinon ton probleme à toi vient du fait que sed est greedy, * prendra le maximum de charactères.

    tu pourrais rechercher un truc du genre addressedusite([^"]*), mais attention tes balises a peuvent être formés avec des ", ' ou rien du tout (href=...)
  • # sed c'est bien.

    Posté par  (site web personnel) . Évalué à 2.

    avec un seul sed et sans uuoc :

    grep /truc/m < page.html | sed -e 's/^.*adressedusite//' -e 's/".*//'
    • [^] # Re: sed c'est bien.

      Posté par  . Évalué à 2.

      Oui enfin autant ne pas utiliser de pipe quand c'est pas nécéssaire (en interne le shell utilise un pipe système dans ta version) :
      grep /truc/m page.html | sed -e 's/^.*adressedusite//' -e 's/".*//'

      De plus enchainer un grep puis un sed, c'est souvant factorisable :
      sed -n -e 's/^.*adressedisite//p'

      Après pour ce qui est des expressions régulières dont a besoin l'auteur du fil je n'ai pas bien compris ce qu'il veut en entrée et en sortie.

      En tout cas pour récupérer les liens mois je fais ça :
      sed -n -e 's/^.*<[aA] .*[Hh][Rr][Ee][Ff]="\?\([^" >]*\)"\? *.*$/\1/gp' index.html

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

      • [^] # Re: sed c'est bien.

        Posté par  . Évalué à 1.

        Merci à tous pour ces infos.
      • [^] # Re: sed c'est bien.

        Posté par  (site web personnel) . Évalué à 2.

        en interne le shell utilise un pipe système dans ta version
        non, le shell ne fait que lancer grep avec le fichier comme entrée standard au lieu du terminal. On peut même dire que ma méthode est plus efficace car le terminal n'est jamais ouvert et le fichier html est déjà ouvert au lancement de grep.

        Les pipes c'est uniquement lors d'un enchainement de commandes, style:
        sort /etc/passwd | more
        où là, un pipe est créé, et la sortie standard de sort est redirigée vers le pipe et l'entrée de more est la sortie du pipe.

        enchainer un grep puis un sed, c'est souvant factorisable
        Tu peux me dire l'intérêt de l'option '-n' ? Ma page man me dit : "suppress automatic printing of pattern space", ce qui à mon sens ne veut rien dire d'humainement compréhensible.
        • [^] # Re: sed c'est bien.

          Posté par  (site web personnel) . Évalué à 1.

          Tu peux me dire l'intérêt de l'option '-n' ? Ma page man me dit : "suppress automatic printing of pattern space", ce qui à mon sens ne veut rien dire d'humainement compréhensible.

          un test te fera comprendre tout de suite l'interet de l'option
        • [^] # Re: sed c'est bien.

          Posté par  . Évalué à 2.

          Tu as raison sur le fait que le shell n'utilise pas un pipe en interne après sur l'efficacité. Les deux font un open sur le fichier. Peut être que grep fait un mmap pour être plus rapide dans certaines conditions mais c'est tout.

          Pour ce qui est de l'option -n de sed. En fait cette option supprime l'affichage automatique. Ce que que tu tu veut qui soit affiché doit l'être explicitement avec l'option p à la fin des expresssions.

          Tu peut appliquer la même rêgle si tu utilise grep et awk. Tu peut mettre des conditions dans le langage awk. Du coup si tu utilise grep + cut, il est aussi probable de pouvoir remplacer ça par du awk.

          Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # PEEEEEEERRRRRRRRLLLL

    Posté par  (site web personnel) . Évalué à 3.

    perl -MHTML::SimpleLinkExtor -MLWP::Simple -e 'map{print"$_\n"}grep{/REGEXP/}HTML::SimpleLinkExtor->new->parse(get("URL"))->links;'

    \o/

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.