Salut,
Euh... sans connaître le Perl (comme moi), mais avec juste un peu de Perl alors...
;)Code:grep -Po '^[^ ]* \K[D-N][^ ]*' fichier
Version imprimable
Comme je ne trouvais pas la solution super, voici 1 autre version a peu près pareil, donc aussi sans création de fonction et cette fois-ci sans pipe (par contre toujours avec eval mais un peu plus maitrisé par '%q' au lieu de '%s' :aie:)
Si on avait garder '%s' au lieu de '%q', on aurait pas pu avoir des lignes du genre:Code:$ $(printf "eval a=%q;a=%q;b='%q%q%q%q%q';case \$a in [D-Nd-n]*) echo \$a;;esac;\n" $(<fifi))
On est ok, mais il y a l'ombre de perl ici, moi je voulais une version sans et en un seul grep (pour moi, ce n'est pas possible, mais je me trompe peut-être).Code:7934 MI;ls;LLER CLERK 7782 23-JAN-82 1300 10
Je pense que l'ami Flodelarab c'est un peu trompé dans sa réponse en rapport avec mes dires, où je précisais bien en ¹ : Et son option -P (Po pour être exact)
Donc, non sans cette option, grep ne peut le faire ;)
Plus concis en awk:
Code:awk '{$0=$2}/^[D-N]/' fifi
Puisque vous avez tous craqué et donné toutes les réponses, je donne les versions auxquelles j'ai pensé tout du long:
[edit]Y a un probleme d'affichage sur le forum pour la der ligne:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 $ cut -d' ' -f2 texte.txt|grep "^[D-N]" JONES MARTIN KING JAMES FORD MILLER $ grep -o " [D-N][A-Z]\{0,5\} " texte.txt JONES MARTIN KING JAMES FORD MILLER $ sed -n '/^[0-9]* [D-N]/p' texte.txt 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 30 7839 KING PRESIDENT 7839 17-NOV-81 5000 10 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 $ sed -n 's/^[0-9]* \([D-N][A-Z]*\).*/\1/p' texte.txt JONES MARTIN KING JAMES FORD MILLER $ awk '($2 ~ /^[D-N]/){print $2;}' texte.txt JONES MARTIN KING JAMES FORD MILLER $ shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// / }";a="${a//+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob; JONES MARTIN KING JAMES FORD MILLER
$ shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// / }";a="${a//+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob;
[/edit]
[edit2]shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// /à }";a="${a//à+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob;
[/edit2]
N'empêche que moi, je trouve ça beau...
Bon, le coup du grep -o qui fonctionne...Hmmm :ptdr:
Par contre, la dernière solution de Flodelarab, c'est une voie que j'avais exploré sans succès car j'ai pas pensé à l'option extglob (et d'ailleurs, j'y pense jamais à ces divers shopt :cry: ), donc :bravo:
Bon, j'espère que programmation_ en aura profité pour apprendre des choses et n'aura pas fait juste un copier/coller.
Le résultat des solutions proposées est:
JONES
MARTIN
KING
JAMES
FORD
MILLER
Mais la solution sauf erreur de ma part doit être:
KING puisque ce mot est compris alphabétiquement entre D et N.
Merci quand même ^^
mais bien sûr, c'est une requête tellement fréquente : «trouver le mot, dont toutes les lettres, qui le composent, sont comprises entre deux lettres» !Citation:
Mais la solution sauf erreur de ma part doit être:
KING puisque ce mot est compris alphabétiquement entre D et N.
Le problème est étrange et surtout très mal posé.
J'imagine bien aller dans une bibliothèque et voir un rangement des livres comme ça.
Mais comme en mathématique, lorsque l'énoncé est ambigu, la réponse est considérée comme bonne si elle répond à l'une des ambiguités.
M'enfin, de toute façon, cela ne change pas grand chose aux solutions données, il faut juste réadapter l'expression régulière.
Sinon, on peut aussi jouer sur ce type de registre et dire que seul le résultat compte (après tout, on n'est pas obligé de dévoiler les sources du programme) et donc:
Répond à la question...:aie:Code:echo KING
Code:
1
2 $ fu () { [[ "$2 " =~ ^[D-N][^A-CO-Z]*[D-N]\ ]] && printf "${2// */}\n" ; shift 7 ; [[ $# -ne 0 ]] && fu $* ; } && fu $(<fifi) KING
Code:
1
2 $ sed -n -e 's/^[0-9]* \([D-Nd-n]\+\) .*/\1/p' fifi KING
Code:
1
2 $ eval $(printf "echo '%s %s %s %s %s %s %s'| (read a a b; case \"\$a \" in [D-N][^A-CO-Z]*[D-N]\ ) echo \$a;;esac);\n" $(<fifi)) KING
Code:
1
2 $ $(printf "eval a=%q;a=%q;b=%q%q%q%q%q;case \"\$a \" in [D-N][^A-CO-Z]*[D-N]\ ) echo \$a;;esac;\n" $(<fifi)) KING
Code:
1
2 $ awk '{$0=$2}/^[D-N]+$/' fifi KING
Je vous remercie de votre aide.
J'aimerais avoir des explications sur cette instruction proposée:
Code:
1
2 awk '{$0=$2}/^[D-N]+$/' base.txt
Cette commande utilise des spécificités du langage awk qui ne sont pas spécialement intuitives ou didactiques, surtout pour un débutant.
L'objectif était pour moi de rechercher la commande la plus courte répondant à l'interprétation absurde de l'énoncé du TP en question.