IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[SHELL] recherche d'une chaine


Sujet :

Linux

  1. #1
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut [SHELL] recherche d'une chaine
    Bonjour je dois chercher toutes les URLs dans tous les fichiers de tous les sous répertoires d'un répertoire....comme ça n'est pas très clair et qu'un exemple vaut mieux qu'un grand discours j'ai un répertoire DossierPere et je veux chercher toutes les URL qui sont dans tous les fichiers de ce répertoire et de tous ses sous-répertoires....
    pour le moment j'ai ceci qui me retourne les lignes complètes où il y a une URL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #pour i parcourant tous les fichiers 
    for REP in `find * -type d` ; do
    	for FICH in $REP/* ; do
    		if [ -f $FICH ] ; then
    			 egrep '(http)' $FICH
    		fi
    	#fin pour fichiers
    	done
    #fin pour répertoires
    done
    or moi je ne voudrais QUE les URL....sauriez-vous comment faire svp?.
    (je ne veux que des URL avec le protocole HTTP)
    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 730
    Points : 31 053
    Points
    31 053
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par magicbisous-nours Voir le message
    Bonjour je dois chercher toutes les URLs dans tous les fichiers de tous les sous répertoires d'un répertoire....comme ça n'est pas très clair et qu'un exemple vaut mieux qu'un grand discours j'ai un répertoire DossierPere et je veux chercher toutes les URL qui sont dans tous les fichiers de ce répertoire et de tous ses sous-répertoires....
    pour le moment j'ai ceci qui me retourne les lignes complètes où il y a une URL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #pour i parcourant tous les fichiers 
    for REP in `find * -type d` ; do
    	for FICH in $REP/* ; do
    		if [ -f $FICH ] ; then
    			 egrep '(http)' $FICH
    		fi
    	#fin pour fichiers
    	done
    #fin pour répertoires
    done
    or moi je ne voudrais QUE les URL....sauriez-vous comment faire svp?.
    Ben oui =>il te suffit de faire un grep "http" et de regarder s'il t'a renvoyé quelque chose => si c'est le cas c'est que tu avais une URL donc il te suffit de l'afficher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #pour i parcourant tous les fichiers 
    for REP in `find * -type d` ; do
    	for FICH in $REP/* ; do
    		if [ -f $FICH ] ; then
    			 result=`egrep '(http)' $FICH`
                             test -n "$result" && echo "$result"
    		fi
    	#fin pour fichiers
    	done
    #fin pour répertoires
    done
    Maintenant c'est dommage de faire un test sur les fichiers alors que "find" peut te les trouver plus rapidement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #pour i parcourant tous les fichiers 
    find * -type f -print |while read FICH ; do
    	result=`egrep '(http)' $FICH`
    	test -n "$result" && echo "$result"
    #fin pour fichiers....
    done

  3. #3
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    ça me retourne exactement le même résultat : toutes les lignes qui contiennent une URL.....mais les lignes complètes alors que je ne voudrais que les URLs......je cherche depuis hier sans succès...
    en tout cas merci de ta réponse....

  4. #4
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    C'est l'option -o de egrep. Il faut lui donner l'expression rationnelle correspondant à l'URL.

  5. #5
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    voici mon code avec vos conseils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #pour i parcourant tous les fichiers 
    find * -type f -print |while read FICH ; do
    	result=`egrep -o '^(http://){0,1}[A-Za-z0-9][A-Za-z0-9\-\.]+[A-Za-z0-9]\.[A-Za-z]{2,}[\43-\176]*$' $FICH`
    	test -n "$result" && echo "$result"
    #fin pour fichiers....
    done
    et voici ce que me répond mon serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    egrep: illegal option -- o
    usage: egrep [-c|-l|-q] [-bhinsvx] -e pattern_list...
            [-f pattern_file...] [file...]
    et quand je fais un man egrep je ne vois pas l'option -o....
    apparamment cela vient du fait que je n'ai pas le GNU grep.....et je ne peux l'installer car c'est un gros serveur utilisé par beaucoup de monde dans la boîte et je suis stagiaire...

  6. #6
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Tu peux utiliser sed alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nr 's/.*(regexp).*/\1/p'
    L'option -r est pour les regexp étendues ; c'est -E sur certains sed. Si tu n'as ni l'un ni l'autre, il suffit de mettre un backslash devant les parenthèses.

    Attention : si tu peux avoir plusieurs URL sur la même ligne, c'est beaucoup plus compliqué à gérer.

  7. #7
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai vu un sed -e.....j'ai utilisé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat  $FICH | sed -ne 's/.*\(http[a-zA-Z0-9:/.]+$.\)*/\1/p'
    et ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ne 's/.*\(http[a-zA-Z0-9:/.]+$.\)*/\1/p' $FICH
    là je pense ça vient de ma regex qui doit pas être terrible donc je continues mes recherches et vous remercie de l'attention que vous me portez...
    [EDIT] : au temps pour moi le message d'erreur était dût à la ligne du dessous que je n'avais pas vu.... en fait je n'ai que des lignes vides

  8. #8
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Non, pas -e : -r ou -E pour les regexp étendues (cf man).

    Je ne comprends pas la fin de ta regexp.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/.*\(http:[a-zA-Z0-9./]*\).*/\1/p'
    (en adaptant la regexp)

  9. #9
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    c'est bon ça marche...merci @ tous
    mon tuteur me demande maintenant de remplacer certaines parties de certaines URLs.....est-ce que je peux faire une regex dans une autre??
    j'explique ma question si je fais quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s%sed -n 's/.*\(http:[a-zA-Z0-9./]*\).*/\1/p'%<ma nouvelle valeur>
    ça marche??
    en adaptant bien sur la regex pour ne pas qu'elle remplace toutes les URLs mais uniquement les parties désirées
    [EDIT : ]
    bon pour faire des tests j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s%'s/.*\(http:\/\/bht.ill.fr\/\).*/\1/p'%\(http:\/\/bhtdev.ill.fr\/\) listeURL.txt
    (j'ai auparavant chargé la liste des URLs dans listeURL.txt qui se trouve dans le même dossier que le script)
    et ça me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./listeURL2[10]: s%s/.*\(http:\/\/bht.ill.fr\/\).*/\1/p%(http://bhtdev.ill.fr/):  not found.
    qu'est-ce qui ne va pas svp?? merci d'avance

  10. #10
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai aussi essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/.*\(http:\/\/bht.ill.fr\/\).*/\1/p/\(http:\/\/bhtdev.ill.fr\/\)/g' listeURL.txt
    avec cette réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: Function s/.*\(http:\/\/bht.ill.fr\/\).*/\1/p/\(http:\/\/bhtdev.ill.fr\/\)/g cannot be parsed.

  11. #11
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Soit tu fais deux scripts sed séparés : le premier récupère les url, le 2e les modifie (je le conseille si tu as plusieurs transformations à faire).

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    < listeURL.txt sed -n 's/.*\(regexp-url\).*/\1/p' | sed 's/http:\/\/bht.ill.fr\//http:\/\/bhtdev.ill.fr\/\)/g'
    Ou en une commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.*\(http:\/\/bht.ill.fr\/\).*/http:\/\/bhtdev.ill.fr\//g' listeURL.txt
    J'ai pas testé, mais bon, tu vois la syntaxe.

  12. #12
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai essayé par l'intermédiaire d'une variable ça donne ceci ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -n 's/.*\(http:\/\/bht.ill.fr\/\).*/\1/p' $FICH > $URL
    sed 's/'$URL'/\(http:\/\/bhtdev.ill.fr\/\)/g' listeURL.txt
    mais ça tourne genre boucle infinie sans rien faire.....vais tester ta méthode avec deux scripts....

  13. #13
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Que vaut $FICH ? Je suis prêt à parier que ce n'est pas une boucle infinie, mais qu'il attend juste l'entrée.

    Je crois que tu confonds variable et fichier. Une redirection (>) remplit un fichier et non une variable.

  14. #14
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    merci de m'avoir fait remarquer $FICH il servait lorsque le script parcourait tous les fichiers à lire le fichier en cours.....
    non je ne confond pas mais quand j'ai fait URL=maregex ça n'a pas fonctionné....(j'ai fait un peu de C et de C++ avant et je fais de l'algo en cours (c'est une des rares matières où je peux dire sans me tromper avoir plus de 15^^))
    PS : quand je fais $URL= ou URL= ça ne fait que m'afficher la liste des URL....ça ne les modifies même pas dans le fichier.....

  15. #15
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Pour initialiser une variable :
    Pour accéder à une variable :

  16. #16
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    ok merci mais pour la ligne d'après je fais comment pour appeler ma variable $URL?? apparament le s/$URL/.... ne fonctionne pas.....

  17. #17
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    C'est ce que je te disais : tu mélanges fichiers et variables.

    Sed travaille sur un flux (fichier ou autre), pas sur des variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat in
    blabla
    bla http://bht.ill.fr/foo bla
    blah
    $ URL=$(sed -n 's/.*\(http:\/\/[a-z.-\/]*\).*/\1/p' < in)
    $ echo $URL | sed 's/http:\/\/bht.ill.fr\//http:\/\/bhtdev.ill.fr\//g'
    http://bhtdev.ill.fr/foo
    Mais passer par une variable n'est pas utile ici : je t'avais indiqué deux autres solutions...

  18. #18
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    excuses moi pour les deux autres solutions celle des deux scripts ne m'arrangeait pas trop et l'autre j'avais mal lu.....
    j'ai testé la commande et je n'ai pas de modification et j'ai testé ta solution du dessus et il plante sur la première URL qu'il trouve qui ne contient pas http:/ /bht.ill.fr/ .....je regardes ça de plus près...ça me donnes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ./listeURL2
    ./listeURL2: =http://intranet.ill.fr/piu/prod/images/bg11r.gif:  not found.
     
    root@broutill: ./listeURL2
    ./listeURL2: =:  not found.
    entre les deux message d'erreur j'ai mis un espace après le "="

  19. #19
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    j'ai essayé avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $URL = $(sed -n 's/.*\(http:[a-zA-Z0-9./:]*\).*/\1/p'  listeURL.txt)
    echo $URL | sed 's/http:\/\/bht.ill.fr\//http:\/\/bhtdev.ill.fr\//g'
    ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $URL = $(sed -n 's/.*\(http:[a-zA-Z0-9./:]*\).*/\1/p' < listeURL.txt)
    echo $URL | sed 's/http:\/\/bht.ill.fr\//http:\/\/bhtdev.ill.fr\//g'
    (j'ai modifié la regex car c'est celle qui m'a trouvé mes URLs et me les a chargées dans listeURL.txt)
    mais ce ***** de serveur me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./listeURL2: =:  not found.
    alors que RIEN dans listeURL.txt ne ressemble à ça...
    je comprends pas j'ai édité le fichier listeURL pour enlever toutes les lignes où il y avait des : ailleurs qu'après http, j'ai échappé tous les : qui se trouvent dans mon code et même résultat.....pourriez-vous m'aider svp??

  20. #20
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Ouvre les yeux et apprends à recopier.

    Ou alors, copie-colle.

Discussions similaires

  1. [Tableaux] Recherche d'une chaine dans un tableau
    Par tom06440 dans le forum Langage
    Réponses: 5
    Dernier message: 20/10/2005, 23h27
  2. Client POP3 en C - Recherche dans une chaine
    Par titelily dans le forum C
    Réponses: 12
    Dernier message: 13/06/2005, 02h13
  3. [VB.NET] Recherche dans une chaine de caractères
    Par Pleymo dans le forum Windows Forms
    Réponses: 12
    Dernier message: 09/04/2005, 10h25
  4. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo