OVH Cloud OVH Cloud

grep pas cooperatif

9 réponses
Avatar
Remi Moyen
Salut,

C'est sûrement trivial, mais je n'arrive pas à trouver la regexp kivabien
pour un grep.

Je cherche à trouver (dans des entêtes de fichiers C++) un mot clé (un nom
de classe), disons Toto, sachant qu'il peut y avoir des classes avec des
noms similaires (TotoBidule) qui ne m'intéressent pas.

Typiquement, mon fichier peut contenir

class Toto { [ou : à la place de {, mais ça change pas la question]
class Toto{
class Toto
class TotoBidule
class TotoBidule {

Si je fais :
$ grep "Toto[^[:alpha:]]" fichier
class Toto {
class Toto{

Il me manque le 'class Toto' (sans rien derrière, saut de ligne).

Bien sûr, je peux faire un "Toto$", mais alors je n'ai *que* cette ligne.
J'ai essayé de combiner les deux et de faire un truc style
"Toto[[^[:alpha]]|$]", mais ça marche pas mieux. Pas de succès non plus en
essayant de coder la fin de ligne par un \n.

(je vous ai présenté que le petit détail qui me gène, en réalité mes
lignes sont déjà bien séléctionnées sur d'autres critères. En particulier,
pas de problème sur ce qu'il peut y avoir *avant* Toto)

Merci de votre aide !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

9 réponses

Avatar
Stephane Chazelas
2005-01-10, 16:37(+01), Remi Moyen:
Salut,

C'est sûrement trivial, mais je n'arrive pas à trouver la regexp kivabien
pour un grep.

Je cherche à trouver (dans des entêtes de fichiers C++) un mot clé (un nom
de classe), disons Toto, sachant qu'il peut y avoir des classes avec des
noms similaires (TotoBidule) qui ne m'intéressent pas.

Typiquement, mon fichier peut contenir

class Toto { [ou : à la place de {, mais ça change pas la question]
class Toto{
class Toto
class TotoBidule
class TotoBidule {

Si je fais :
$ grep "Toto[^[:alpha:]]" fichier
class Toto {
class Toto{
[...]


Avec certains grep:

grep -w Toto

ou

grep 'Toto>'

Sinon:

grep -e 'Toto[^[:alpha:]]' -e 'Toto$'

perl -ne 'print if /Totob/'

perl -ne 'print if /Toto(?![[:alpha:]])/'


Pour -w b, >, c'est plutot [[:alnum:]] voire [[:alnum:]_] que
[[:alpha:]].

--
Stephane

Avatar
Pascal Bourguignon
Remi Moyen writes:

Salut,

C'est sûrement trivial, mais je n'arrive pas à trouver la regexp
kivabien pour un grep.

Je cherche à trouver (dans des entêtes de fichiers C++) un mot clé (un
nom de classe), disons Toto, sachant qu'il peut y avoir des classes
avec des noms similaires (TotoBidule) qui ne m'intéressent pas.

Typiquement, mon fichier peut contenir

class Toto { [ou : à la place de {, mais ça change pas la question]
class Toto{
class Toto
class TotoBidule
class TotoBidule {

Si je fais :
$ grep "Toto[^[:alpha:]]" fichier
class Toto {
class Toto{

Il me manque le 'class Toto' (sans rien derrière, saut de ligne).

Bien sûr, je peux faire un "Toto$", mais alors je n'ai *que* cette
ligne. J'ai essayé de combiner les deux et de faire un truc style
"Toto[[^[:alpha]]|$]", mais ça marche pas mieux. Pas de succès non
plus en essayant de coder la fin de ligne par un n.


Normal, puisque [xyz] signifie: n'importe quel caractère x, y, ou z.

"Toto[[^[:alpha]]|$]"

matches:

"Toto[]]"
"Toto^]]"
"Toto:]]"
"Totoa]]"
"Totol]]"
"Totop]]"
"Totoh]]"
"Toto[$]"
"Toto^$]"
"Toto:$]"
"Totoa$]"
"Totol$]"
"Totop$]"
"Totoh$]"

(je vous ai présenté que le petit détail qui me gène, en réalité mes
lignes sont déjà bien séléctionnées sur d'autres critères. En
particulier, pas de problème sur ce qu'il peut y avoir *avant* Toto)

Merci de votre aide !


Lire: man grep
man 7 regex
et noter la différence entre `()' et `[]'.

--
__Pascal Bourguignon__ http://www.informatimago.com/
The rule for today:
Touch my tail, I shred your hand.
New rule tomorrow.

Avatar
Remi Moyen
On Mon, 10 Jan 2005, Stephane Chazelas wrote:

$ grep "Toto[^[:alpha:]]" fichier
class Toto {
class Toto{
[...]


Avec certains grep:

grep -w Toto


Ça tombe bien, avec le mien ça marche !

grep 'Toto>'


Ça aussi.

Sinon:

grep -e 'Toto[^[:alpha:]]' -e 'Toto$'


Voui, j'y avais pensé, mais je trouve ça moins joli qu'une seule
expression (je sais, souvent il vaut mieux lisible que "joli").

Pour -w b, >, c'est plutot [[:alnum:]] voire [[:alnum:]_] que
[[:alpha:]].


En effet ([[:alnum:]_], au moins, et peut-être même plus). Mais à la
réflexion, rien ne m'empèche d'avoir des chaînes de type Toto2Bidule, donc
c'est pas plus mal d'utiliser [[:alnum:]] (et même [[:alnum:]_] !) plutôt
que [[:alpha:]].

En pratique, les conventions de code utilisées font que, normalement, je
ne devrais avoir que des TotoBidule (exceptionnellement des Toto2Bidule),
et jamais de Toto_Bidule ou autre caractère de séparation. Donc bon, ça
devrait marcher très bien.

Merci de ta réponse précise et rapide.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Stephane Chazelas
2005-01-10, 17:06(+01), Pascal Bourguignon:
[...]
Lire: man grep
man 7 regex
et noter la différence entre `()' et `[]'.
[...]


Faut egrep ou grep -E pour ().

Note que:

grep -E 'Toto([^[:alpha:]]|$)' ne marchera pas forcement avec tous les
grep (devrait marcher avec tous les grep POSIX cela dit).

grep -E 'Toto([^[:alpha:]].*|)$'
voire
grep -E 'Tot(o[^a-zA-Z].*|o)$'

devraient etre plus portables (utiliser egrep si grep ne
reconnait pas -E).

--
Stephane

Avatar
Stephane Chazelas
2005-01-10, 17:26(+01), Remi Moyen:
[...]
Pour -w b, >, c'est plutot [[:alnum:]] voire [[:alnum:]_] que
[[:alpha:]].


En effet ([[:alnum:]_], au moins, et peut-être même plus). Mais à la
réflexion, rien ne m'empèche d'avoir des chaînes de type Toto2Bidule, donc
c'est pas plus mal d'utiliser [[:alnum:]] (et même [[:alnum:]_] !) plutôt
que [[:alpha:]].

En pratique, les conventions de code utilisées font que, normalement, je
ne devrais avoir que des TotoBidule (exceptionnellement des Toto2Bidule),
et jamais de Toto_Bidule ou autre caractère de séparation. Donc bon, ça
devrait marcher très bien.
[...]


Note que suivant la locale, [:alpha:] ne match pas forcement la
meme chose ("é" par exemple).

--
Stephane


Avatar
Remi Moyen
On Mon, 10 Jan 2005, Stephane Chazelas wrote:

Note que suivant la locale, [:alpha:] ne match pas forcement la
meme chose ("é" par exemple).


Je sais. Mais là encore, avec [:alpha:], je suis plus sûr qu'avec un
[a-zA-z] où il manquerait les caractères "locaux", justement. Bien que je
vois mal comment des caractères non ASCII de base se glisseraient dans mon
fichier...

(c'est autorisé, ça, en C/C++, des identifiants avec des accents, par
exemple ?)
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

Avatar
Jean-Marc Bourguet
Remi Moyen writes:

On Mon, 10 Jan 2005, Stephane Chazelas wrote:

Note que suivant la locale, [:alpha:] ne match pas forcement la
meme chose ("é" par exemple).


Je sais. Mais là encore, avec [:alpha:], je suis plus sûr qu'avec un
[a-zA-z] où il manquerait les caractères "locaux", justement. Bien que je
vois mal comment des caractères non ASCII de base se glisseraient dans mon
fichier...

(c'est autorisé, ça, en C/C++, des identifiants avec des accents, par
exemple ?)


Oui. Mais tres mal supporte en pratique. Une representation
normalisee est prevue (uXXXX UXXXXXXXX) et on aurait pu s'attendre a
ce que les compilateurs supportent directement les codages commun sur
la plateforme. Mais ca pose un interessant probleme de designation du
codage a utiliser.

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Pascal Bourguignon
Jean-Marc Bourguet writes:

Remi Moyen writes:

On Mon, 10 Jan 2005, Stephane Chazelas wrote:

Note que suivant la locale, [:alpha:] ne match pas forcement la
meme chose ("é" par exemple).


Je sais. Mais là encore, avec [:alpha:], je suis plus sûr qu'avec un
[a-zA-z] où il manquerait les caractères "locaux", justement. Bien que je
vois mal comment des caractères non ASCII de base se glisseraient dans mon
fichier...

(c'est autorisé, ça, en C/C++, des identifiants avec des accents, par
exemple ?)


Oui. Mais tres mal supporte en pratique. Une representation
normalisee est prevue (uXXXX UXXXXXXXX) et on aurait pu s'attendre a
ce que les compilateurs supportent directement les codages commun sur
la plateforme. Mais ca pose un interessant probleme de designation du
codage a utiliser.


Le driver gcc sur NeXTSTEP était même capable de prendre un source RTF
et de le prétraiter avant de le compiler. Il est possible que ce soit
encore possible sur MacOSX. Imaginez, écrire du source Objective-C++
avec du gras, de l'italique et des couleurs! :-)


--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush



Avatar
Jean-Marc Bourguet
Pascal Bourguignon writes:

Le driver gcc sur NeXTSTEP était même capable de prendre un source RTF
et de le prétraiter avant de le compiler. Il est possible que ce soit
encore possible sur MacOSX. Imaginez, écrire du source Objective-C++
avec du gras, de l'italique et des couleurs! :-)


Pas mal. Ca me rappelle Web cher a Knuth ainsi qu'un langage assez
amusant dont j'ai lu une description dans un bouquin consacre a
l'histoire des langages de programmation (cela fait environ 15 ans,
c'etait un bouquin de la bibliotheque de la Fac, je ne me souviens
plus du titre) qui avait de la couleur, une couleur pour les
commentaires, une pour le code propremment dit. Il y a aussi color
Forth dans le genre...

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org