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

Shell et commandes POSIX Discussion :

Recherche et extraction


Sujet :

Shell et commandes POSIX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 571
    Points : 97
    Points
    97
    Par défaut Recherche et extraction
    Bonjour,

    Est il possible en shell de rechercher un mot dans un texte et d'en extraire les 5 mots avant et les 5 mots après ?

    Par exemple,
    MyTexte = "Le podium. TF1 achevait jeudi soir la diffusion de la saison 2 de Falco. Les deux derniers épisodes de la série avec Sagamore Stévenin ont fédéré 5,5 millions de téléspectateurs, en légère baisse par rapport à la semaine dernière. France 3 arrive deuxième avec un western classique, Les sept mercenaires, qui a passionné 2,6 millions de téléspectateurs. France 2 et Envoyé spécial complètent le podium avec 2,5 millions de fidèles."

    -> Rechercher "France 3"
    -> Extraire "rapport à la semaine dernière. France 3 arrive deuxième avec un western"

    Merci pour votre aide ...

    Thais

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je me risque à une réponse, qui fonctionne mais pour laquelle je ne sais pas si elle respectera les contraintes éventuelles (du fait qu'on est dans la section Unix et non Linux notament)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po "([^ ]+ ){5}France 3( [^ ]+){5}" <<< $MyTexte
    sinon via Perl directement sur le même principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print $1."\n" if /((?:[^ ]+ ){5}France 3(?: [^ ]+){5})/' <<< $MyTexte
    en espérant que ça réponde à ta question

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,
    Sous quel Unix ?
    La question est vague, voici une solution qui fonctionne a peu près avec un grep qui supporte la répétition ( {5} ):
    Ici, je considère qu'un mot est un ensemble de caractères séparé par un ou plusieurs espaces et que le texte est sur une ligne (d'un point de vue système):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo $MyTexte
    Le podium. TF1 achevait jeudi soir la diffusion de la saison 2 de Falco. Les deux derniers épisodes de la série avec Sagamore Stévenin ont fédéré 5,5 millions de téléspectateurs, en légère baisse par rapport à la semaine dernière. France 3 arrive deuxième avec un western classique, Les sept mercenaires, qui a passionné 2,6 millions de téléspectateurs. France 2 et Envoyé spécial complètent le podium avec 2,5 millions de fidèles.
    $ echo $MyTexte | grep -o '\([^[:space:]]\+[[:space:]]\+\)\{5\}France 3\([[:space:]]\+[^[:space:]]\+\)\{5\}'
    rapport à la semaine dernière. France 3 arrive deuxième avec un western
    Et une version avec un grep qui ne supporte pas la répétition (la regex est beaucoup plus longue puisque l'on est obligé de la répéter autant que besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo $MyTexte | grep -o '[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+France 3[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]\+[^[:space:]]\+'
    rapport à la semaine dernière. France 3 arrive deuxième avec un western
    Cordialement.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 571
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Merci pour votre aide.
    Je souhaite intégrer cette fonction dans un AppelScript.
    Et pour être franche, je ne sais pas trop quel Unix se cache derrière ....
    Normalement on doit pouvoir faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		set sRech to "\([^[:space:]]\+[[:space:]]\+\)\{5\}France 3\([[:space:]]\+[^[:space:]]\+\)\{5\}"
    		set sShell to "echo " & (quoted form of sText) & " | grep -o " & (quoted form of sRech)
    		try
    			set myResult to do shell script sShell
    		end try
    Mais bon, un simple copier/coller, ne fonctionne pas
    Et je suis très mauvaise en RegEx .....

    Si vous avez une piste n'hésitez pas, je vais également creuser de mon coté et vous tiens au courant.

    Thais

    PS EDIT : Pour info, le code suivant marche, mais ne m'extract que le mot trouvé et pas les 5 devant et les 5 derrières.
    Si c'est plus simple, on peut aussi extiare les 20 caractères devant et les 20 derrières ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    set sRech to "France 3"
    set sShell to "echo " & (quoted form of MyText) & " | grep -oP " & (quoted form of sRech)
    try
    	set myRresult to do shell script sShell
    end try

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Je ne connais pas applescript (derrière on doit être sur du MAC OS), mais je vois que tu fourni une version "quoted" de la regex, il y a de forte chance que cela soit ceci qui gêne, essaie avec ces lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set sRech to "([^[:space:]]+[[:space:]]+){5}France 3([[:space:]]+[^[:space:]]+){5}"
    set sShell to "echo " & (quoted form of MyText) & " | grep -oP " & (quoted form of sRech)
    Et si cela ne fonctionne pas, avec les ligne suivantes (si on a droit de ne pas "quoted" ???):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set sRech to "([^[:space:]]+[[:space:]]+){5}France 3([[:space:]]+[^[:space:]]+){5}"
    set sShell to "echo " & (form of MyText) & " | grep -oP " & (form of sRech)
    Par ailleurs, je suis surpris de l'option -P du grep (en principe, c'est pour utiliser le moteur de regex de perl mais ce n'est pas documenter dans le man du grep d'apple...)
    Cordialement.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 571
    Points : 97
    Points
    97
    Par défaut
    Merci c'est parfait
    J'aie rajouté l'option -i pour le case control ....

    Merci beaucoup pour ton aide.

    Thais

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 571
    Points : 97
    Points
    97
    Par défaut
    Bonjour,

    Juste une dernière question subsidiaire.
    S'il y a moins de 5 mots entre le début du texte et le mot recherche/trouvé ca n'extrait pas l'info

    Sais tu ce qu'il faut modifier dans la RegEx pour extraire la chaine dans ce cas ?
    Idem pour la fin ....

    Thais

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Sais tu ce qu'il faut modifier dans la RegEx pour extraire la chaine dans ce cas ?
    Il faudra nous donner un peu plus de précisions : combien de mot au minimum et au maximum ?

    Par exemple, si tu peux avoir entre 3 et 5 mot, tu peux remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "([^[:space:]]+[[:space:]]+){3,5}France 3([[:space:]]+[^[:space:]]+){3,5}"
    A toi de définir les règles et la regexp viendra toute seule

    Idriss

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Juste une petite précision sur la réponse de ok.Idriss:
    La plupart des moteurs de regex (dont celui de grep) recherche la plus grande correspondance possible, donc si tu mets {0,5}, il retournera entre 0 et 5 "mots" mais choisira en priorité 5 sinon 4,...
    Cordialement.

Discussions similaires

  1. [XL-2007] [VBA] Recherche multiple & Extraction
    Par deb_5588 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 04/02/2013, 14h51
  2. indexation, recherche et extraction d'infos
    Par MMDM12 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/06/2012, 10h35
  3. [Toutes versions] Recherche et Extraction
    Par BAHIRI dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 07/05/2012, 16h13
  4. recherche et extraction de l'information
    Par rom05 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/04/2008, 09h48
  5. Recherche Logiciel Extraction Audio
    Par Sami Xite dans le forum Audio
    Réponses: 2
    Dernier message: 24/10/2006, 20h51

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