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 02/04/2013, à 19:42

Archonic

[Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Bonsoir,

Toujours dans le même document - que vous pouvez consulter ici : "Linux essentials" (Linup Front) - il y a des exercices du chapitre 7 que je ne parviens pas à démêler.

A la page 100, les exercices 7.4 et 7.5 :
7.4 : Cherchez dans /usr/share/dict/words tous les mots qui contiennent exactement les 5 voyelles a, e, i, o, et u dans cet ordre.
La difficulté me semble être très au dessus du contenu du chapitre ; et la solution donnée à la fin du syllabus est illisible (mauvaise impression du PDF) - elle est renseignée à la page 215.

Je n'ai pas la moindre idée de la façon de résoudre cet exercice.  Je devine, en essayant de démêler ce qui reste lisible dans la solution, qu'il faut compléter une variable avec les voyelles.

Celle-ci est donnée sous la forme "k=[aeiou]", il s'agit donc d'une liste de caractères possibles
Là où c'est moins clair : cette variable est ensuite utilisée comme ceci "{k}".  Il me semblait que les accolades servaient à indiquer un "nombre de répétitions".  Peut-on dès lors y mettre des caractères?

En bref : je ne comprends pas!

7.5 : Donnez une commande pour localiser et afficher toutes les lignes du fichier "Frog king" dans lequel un mot d'au moins 4 lettres apparaît 2 fois.
Le fichier "frog king" est disponible à la page 223)

La solution proposée est la suivante (page 215):

egrep '(\<[A-Za-Z]{4,}\>).*\<\1\>' frog.txt

Je comprends \< \> indiquant un "mot exactement comme ...".
Je comprends [A-Za-z] indiquant que ce mot doit être composé exclusivement de lettres.
Je comprends ".*" indiquant un caractère quelconque répété au moins une fois. (0 ou plus)

Je ne comprends pas "{4,}".  La répétition doit avoir lieu {x,y} de x à y fois.  Il n'y a pas de "y" cette fois.  Qu'est-ce que ça signifie?
Je ne comprends pas non plus le "1" après "*" : \<\1\>

Pourriez-vous m'éclairer sur ces deux exercices?

Merci d'avance smile

Dernière modification par Archonic (Le 02/04/2013, à 23:13)

Hors ligne

#2 Le 02/04/2013, à 19:49

Hizoka

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Perso je ferais ca pour le 7.4 :

egrep "a.*e.*i.*o.*u" /usr/share/dict/words

Je ne comprends pas "{4,}".

signifie au moins 4 fois ou {4,infini}

Je ne comprends pas non plus le "1" après "*" : \<\1\>

Signifie utilise le résultat de ce qui est entre parenthèse donc

(\<[A-Za-Z]{4,}\>) => splish

\1 => splish

si tu avais plusieurs fois des parentheses, tu pourrais utiliser \1 , \2 , \3...

Dernière modification par Hizoka (Le 02/04/2013, à 19:54)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#3 Le 02/04/2013, à 20:03

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Bonsoir,
Pour 7.4, s'il n'y a q'un seul mot par ligne, je ferais ceci :

grep "a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u" /usr/share/dict/words

Hors ligne

#4 Le 02/04/2013, à 20:23

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Merci pour vos messages.

La solution proposée ressemble à celle de pingouinux, "words" ne contenant effectivement qu'un seul mot par ligne.

Je vous copie ci-dessous ce qui est lisible - moins les choses qui se chevauchent.

k = '[aeiou]*'
grep -i{illisible}a${k}e${k}i${k}o${k}u${k} /usr/share/dict/words

Notez aussi que k n'est pas donné tel quel, il y un "^" qui s'est perdu en route et ça donne ceci : k = '[âeiou]*'

Hors ligne

#5 Le 02/04/2013, à 20:46

Hizoka

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Donc la reponse donnée par pingouilinux doit etre assez proche de celle que tu attendais.

k = '[^aeiou]*'
grep -i "a${k}e${k}i${k}o${k}u${k}" /usr/share/dict/words

Mais ma solution donne la meme chose en plus simple je trouve tongue

En plus je suis le plus rapide tongue

time for i in {1..25}; do grep -i "a${k}e${k}i${k}o${k}u${k}" /usr/share/dict/words; done
real    0m6.724s

time for i in {1..25}; do grep "a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u" /usr/share/dict/words; done
real    0m4.151s

time for i in {1..25}; do grep -i "a.*e.*i.*o.*u.*" /usr/share/dict/words; done
real    0m3.065s

Dernière modification par Hizoka (Le 02/04/2013, à 20:49)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 02/04/2013, à 21:03

miniSeb

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

@Hizoka : ta solution ne répond pas à l'énoncé tongue

Si tu as les chaînes suivantes :

aeiou
aouaieaouiuaeiou
oiuoaaeaaouerdaieou

Les trois chaînes sont matchées alors que seule la première devrait être prise en compte.
La réponse de pingouinux est correcte et il n'y en a pas d'autres (à part jouer avec des variables, mais c'est intrinsèquement la même expression)

Hors ligne

#7 Le 02/04/2013, à 21:04

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

@Hizoka :
La solution que tu donnes en #2 autorise des voyelles intercalaires entre a,e,i,o,u :

$ egrep "a.*e.*i.*o.*u" <<<"aaaxxxeeeyyyiiizzzoootttuuu"
aaaxxxeeeyyyiiizzzoootttuuu

La mienne (#3) n'était pas exacte non plus, car j'autorisais des voyelles avant et après la séquence. Ceci semble plus correct :

grep "[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*" /usr/share/dict/words

ou

grep -i "${k}a${k}e${k}i${k}o${k}u${k}" /usr/share/dict/words

Hors ligne

#8 Le 02/04/2013, à 21:06

miniSeb

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Et encore, la bonne réponse est :

"^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$"

(après test)

Edit : grillé

Dernière modification par miniSeb (Le 02/04/2013, à 21:11)

Hors ligne

#9 Le 02/04/2013, à 21:14

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Je vois, non sans plaisir, que vous vous prenez au jeu.

Pouvez-vous m'indiquer ce que signifie ce "{k}"?  Il ne s'agit pas dans ce cas de répétition, non?

En attendant, je fais décortiquer vos différentes propositions.

Hors ligne

#10 Le 02/04/2013, à 21:17

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

C'est ${k}, qui est le contenu de la variable k.

Hors ligne

#11 Le 02/04/2013, à 21:20

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Hizoka a écrit :

Je ne comprends pas non plus le "1" après "*" : \<\1\>

Signifie utilise le résultat de ce qui est entre parenthèse donc

(\<[A-Za-Z]{4,}\>) => splish

\1 => splish

si tu avais plusieurs fois des parentheses, tu pourrais utiliser \1 , \2 , \3...

Cette partie reste obscure.  Ok pour la récupération de ce qui est entre parenthèses.  Par contre "splish" ne m'évoque rien.

Hors ligne

#12 Le 02/04/2013, à 21:21

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

pingouinux a écrit :

C'est ${k}, qui est le contenu de la variable k.

le contenu de "k" n'est pas "$k" ?

Hors ligne

#13 Le 02/04/2013, à 21:30

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Archonic   #12 a écrit :

le contenu de "k" n'est pas "$k" ?

Si, mais quand la variable est suivie d'autres caractères, il faut l'isoler :

${k}o

est différent de

$ko

Hors ligne

#14 Le 02/04/2013, à 21:56

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Pour le 7.4 (L'histoire avec les voyelles), voici ce que je viens d'essayer :

egrep '^[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$' /usr/share/dict/words

Qui est la solution proposée par miniSeb.

Si je décortique, pour être certain de bien comprendre :
^ --> La ligne commence par ...
^[^aeiou] --> Représente un caractère qui n'est pas une voyelle --> La ligne commence par un caractère qui n'est pas une voyelle
^[^aeiou]* --> Ce caractère peut être répété de 0 à "plein" de fois --> La ligne commence par un caractère qui n'est pas une voyelle, caractère qui peut être répété, ou bien non
^[^aeiou]*a --> Vient ensuite la lettre "a" --> La ligne commence par un caractère qui n'est pas une voyelle, caractère qui peut être répété, ou bien non.  Et après vient la première voyelle

Et ainsi de suite jusqu'à la fin de la ligne, indiquée par "$".

C'est bien ça?

@pingouinux : Ok pour les ${variable}, merci.

Hors ligne

#15 Le 02/04/2013, à 22:00

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

@Archonic #14 : Tu as tout compris

Hors ligne

#16 Le 02/04/2013, à 22:23

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Dans ce cas, merci smile

Reste le 7.5 que je ne comprends que partiellement.

Votre efficacité fait plaisir à voir.  J'ai posé des questions ailleurs, il n'y a qu'ici que j'obtiens des réponses aussi rapides et précises.

Hors ligne

#17 Le 02/04/2013, à 22:29

pingouinux

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

egrep '(\<[A-Za-Z]{4,}\>).*\<\1\>' frog.txt

\1 sera remplacé par la chaîne précédemment trouvée correspondant à la séquence entre parenthèses. Tu dois avoir un mot d'au moins 4 lettres, puis zéro ou plus caractères quelconques, puis un mot identique au précédent.

Hors ligne

#18 Le 02/04/2013, à 22:35

Hizoka

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Archonic => le splitch était un exemple, c'est n'importe quel mot compatible avec ta commande grep.
si la partie entre parenthèse renvoie "splitch" (ou autre mot), \1 vaudra ce mot

miniSeb => mauvais interpretation de sa phrase, je pensais qu'il voulait des mots ou les 5 voyelles étaient présentes dans cet ordre précis et non des mots ou les 5 voyelles se suivaient...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#19 Le 02/04/2013, à 23:12

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Aaah!  J'ai compris!  "Eureka" comme disait l'autre ... mon euro vient de tomber.

\<[A-Za-z]{4,}>\ ---> Un mot de 4 lettres (et rien d'autre que des lettres) au minimum
.* ---> Des caractères quelconques, ou bien rien
\< \1 >\ ---> Suivi du même mot que le précédent

C'est tout simple en fait! smile

Merci smile

Dernière modification par Archonic (Le 02/04/2013, à 23:13)

Hors ligne

#20 Le 02/04/2013, à 23:19

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Pour l'histoire de "\1".  Lorsqu'il y a plusieurs parenthèses, ça fonctionne comment?

(parenthèse 1)(parenthèse 2)(parenthèse 3)(parenthèse 4) --> \1 correspond à laquelle? --> On compte dans quel sens?
(parenthèse 1 (parenthèse 2)   ) ---> Et si elles sont imbriquées?  A quoi correspond \1?  Et \2?

Hors ligne

#21 Le 02/04/2013, à 23:51

Hizoka

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

dans le meme ordre en partant de la gauche
(parenthèse 1)(parenthèse 2)(parenthèse 3)(parenthèse 4)
         \1                    \2                      \3                      \4

je pense pas que tu puisses imbriquer les parentheses


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#22 Le 03/04/2013, à 11:05

miniSeb

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

En fait, si, on peut imbriquer les parenthèses. L'ordre des parenthèses ouvrantes détermine l'ordre des numéros attribués. En prenant un petit exemple comme le suivant (matcher tous les mots commençant par une majuscule) :

(([A-Z])[a-z]+)

On récupérera le mot en entier dans \1 (vu que la première parenthèse ouvrante est couplée avec  la dernière) et la majuscule dans \2.

Maintenant, c'est sûr que l'imbrication a un caractère intéressant pour des exploitations plus complexes qu'un simple match ; cela prend plus de sens dans le cadre d'une substitution. Même si on peut envisager l'utilisation d'un match comme ci-après :

#! /usr/bin/perl -w
use strict;
use warnings;


my $bigstring = q{
Bonjour !
Je m'appelle miniSeb et j'ai 24 ans.
Voici un petit exemple de parenthèses imbriquées ;-)
};

if ( $bigstring =~ /(je m'appelle *([^ ]+))[^\d]+(\d+)/i ) {
  print "\$1 vaut : $1\n";
  print "\$2 vaut : $2\n";
  print "\$3 vaut : $3\n";
}

Au passage, un très bon bouquin sur les regexp (en anglais) :
Friedl, J.. Mastering Regular Expressions (2006). 544p.
http://shop.oreilly.com/product/9780596528126.do
J'en ai pas mal sur le sujet, c'est le meilleur dans le lot wink

Dernière modification par miniSeb (Le 03/04/2013, à 11:16)

Hors ligne

#23 Le 03/04/2013, à 20:27

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

miniSeb a écrit :

En fait, si, on peut imbriquer les parenthèses. L'ordre des parenthèses ouvrantes détermine l'ordre des numéros attribués.

En fonction de l'ordre dans lequel on ouvre les parenthèses?  Ou, comme en math, en fonction des résultats?

Donc, si je te suis bien ça donnera quelque chose comme ceci:

(1)
(1)(2)
((2)(3)) --> La 1 étant celle englobant 2 et 3
(((3)(4))(5)) --> La 2 serait celle englobant 3 et 4 / La 1 celle la plus à l'extérieur

Et ainsi de suite?

Edit : En fait, je ferais aussi bien de sortir bash et de faire des essais smile
Edit 2 : C'est qqchose que tu as lu dans le livre dont tu parles plus haut?  A quelle page, si tu l'as sous la main?

Dernière modification par Archonic (Le 03/04/2013, à 20:30)

Hors ligne

#24 Le 03/04/2013, à 21:04

miniSeb

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Pour les parenthèses tu as bien compris ; c'est en fonction de l'ordre dans lequel on ouvre les parenthèses.

Au niveau du bouquin, j'ai jeté un rapide coup d'oeil, on voit les parenthèses imbriquées pour la première fois (je crois) page 43 -- figure 3.2. Si ça peut t'aider.

Et pour ce qui est de sortir du Bash... C'est à voir.
Moi je code essentiellement en Perl d'où mon exemple mais je pense qu'on peut s'en sortir tout aussi bien en Bash wink

Hors ligne

#25 Le 03/04/2013, à 21:17

Archonic

Re : [Résolu] Utilisation de "grep", exercices ebook "Linux essentials"

Excellent, il a l'air vraiment bien foutu ce "petit" livre.  Je vais l'ajouter à ma liste pour noël, j'en ai encore tellement à lire d'ici là.

Hors ligne