Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

extraire les chaines correspondant à une regexp

9 réponses
Avatar
Tux
Bonjour,

j'ai un fichier pour lequel je souhaite extraire les chaines
correspondant à une expression régulière donnée.
Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?

Merci d'avance

9 réponses

Avatar
FFremont
Tux wrote:

Bonjour,

j'ai un fichier pour lequel je souhaite extraire les chaines
correspondant à une expression régulière donnée.
Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?

Merci d'avance


sed? awk?

Avatar
Thomas Nemeth
Le sam 11 oct 2003 à 10:32, FFremont a tapoté :
| Tux wrote:
|
| > j'ai un fichier pour lequel je souhaite extraire les chaines
| > correspondant à une expression régulière donnée.
| > Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
| > correspondant à l'expression régulière, sans le contexte dans lequel
| > elles apparaissent.
| > Quel langage/utilitaire pourrait me permettre de faire ca ?
|
| sed? awk?

Voire cut, en fonction de la complexité du machin à traiter.


Thomas
--
Ta mère elle veut faire passer ses paquets par INTERNET.
Avatar
Michel Tatoute
Le Sat, 11 Oct 2003 10:32:48 +0200, FFremont a écrit :

Tux wrote:

Bonjour,

j'ai un fichier pour lequel je souhaite extraire les chaines
correspondant à une expression régulière donnée.
Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?

Merci d'avance


sed? awk?


perl ?

$ cat hihi.pl
#!/usr/bin/perl
$_=join('',<>);
s/w+/print($&)/gxes;
print "n";
$ perl hihi.pl hihi.pl
usrbinperl_joinswprintgxesprintn
$


Avatar
Tux
Michel Tatoute wrote:

Le Sat, 11 Oct 2003 10:32:48 +0200, FFremont a écrit :

Tux wrote:

Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?


sed? awk?


perl ?

ok, ca correspond à ce que j'avais essayé, mais comme je ne connais

que très superficiellement ces programmes, je ne savais pas si c'était
les plus appropriés.
Je vais creuser tout ca.

Merci



Avatar
Stephane CHAZELAS
Le Sun, 12 Oct 2003 12:00:59 +0200, Tux écrivait :
[...]
Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?





Voir aussi l'option "-o" des GNU grep récents.

Voir aussi "expr" si ce n'est pas un flux que tu as à traiter.

--
Stéphane




Avatar
Tux
Stephane CHAZELAS wrote:

Le Sun, 12 Oct 2003 12:00:59 +0200, Tux
écrivait :
[...]
Ce que je souhaiterais, c'est n'avoir en sortie que les chaines
correspondant à l'expression régulière, sans le contexte dans lequel
elles apparaissent.
Quel langage/utilitaire pourrait me permettre de faire ca ?





Voir aussi l'option "-o" des GNU grep récents.

Pile poil ce qu'il me fallait. Merci.






Avatar
Stephane CHAZELAS
Le Sun, 12 Oct 2003 16:45:15 +0200, Tux écrivait :
[...]
Voir aussi l'option "-o" des GNU grep récents.

Pile poil ce qu'il me fallait. Merci.



Attention toutefois:

$ echo eee | grep -o e
e
e
e
$ echo eee | grep -o 'a*'
$ 17:18

Meme si 'a*' (0 or more occurrences of "a") matche "eee" (qui
contient bien 0 occurrences de "a" juste au début).

$ echo eee | sed -n 's/(e).*/
1/;s/.*n//p'
e

$ echo eee | sed -n 's/(a*).*/
1/;s/.*n//p'
$ echo aaabb | sed -n 's/(a*).*/

1/;s/.*n//p'
aaa

$ echo eee | perl -lne 'print $& if /e/'
e
$ echo eee | perl -lne 'print $& if /a*/'

$ echo aaabb | perl -lne 'print $& if /a*/'
aaa
$

--
Stéphane


Avatar
Michel Tatoute
Le Sun, 12 Oct 2003 15:26:30 +0000, Stephane CHAZELAS a écrit :

Le Sun, 12 Oct 2003 16:45:15 +0200, Tux
écrivait : [...]
Voir aussi l'option "-o" des GNU grep récents.

Pile poil ce qu'il me fallait. Merci.



Attention toutefois:

$ echo eee | grep -o e
e
e
e
$ echo eee | grep -o 'a*'
$
17:18


heeuuu, c'est pas un bug... mais ca etonne :



$ echo eee | grep -o "e*" >result
^C
$ du result
788K result


Techniquement c'est exact, mais....



Avatar
Stephane CHAZELAS
Le Mon, 13 Oct 2003 02:19:20 +0200, Michel Tatoute écrivait :
[...]
$ echo eee | grep -o e
e
e
e
$ echo eee | grep -o 'a*'
$

heeuuu, c'est pas un bug... mais ca etonne :



$ echo eee | grep -o "e*" >result
^C
$ du result
788K result


Techniquement c'est exact, mais....


Pas tellement, grep aurait pu faire comme le flag "g" des
substitutions de ed, reprendre au charactere suivant (pas à
chaque fois au meme endroit) :

$ echo aaa | sed 's/e*/b/g'
bababab

Ici:

$ echo eee | grep -o "e*"
eee
$ grep --version
grep (grep de GNU) 2.5.1
[...]

C'est cohérent avec le fait que
echo a | grep -o 'e*'
ne retourne rien

Mais bon:

$ echo aba | grep -o 'a*'
a
$ echo aba | grep -o 'a'
a
a

pas très satisfaisant tout ça...

--
Stéphane