URL: https://linuxfr.org/forums/programmation-perl/posts/grep-multi-ligne Title: grep multi-ligne Authors: Ontologia Date: 2006年07月26日T15:40:39+02:00 Tags: Score: 0 Bonjour, j'essaie depuis deux jours d'effectuer un grep multiligne sur un certains nombre de fichier sources pour en extraîres les commentaires. Je cherche à sélectionner des patterns de ce genre : ` - to_ulongint:ULONGINT <- ( //? {self >=0}; //? {self <=# (ULONGINT.maximum)}; ` au milieu de ` // // Conversion format with test. // - to_ulongint:ULONGINT <- ( //? {self >=0}; //? {self <=# (ULONGINT.maximum)}; to_raw_ulongint );` J'ai donc créé l'expression suivante : `^\s*-([.]*)<-\s*\(*\s*//(.*)` Lorsque je la teste avec un outil comme regexp-coach, je constate qu'en gros elle me sélectionne ce que je veux. Mais voilà, problème, je n'arrive pas à la faire marcher avec perl. Principalement, à mon avis, car il s'agit de détecter des pattern de plusieurs lignes. Lorsque je tente une commande du genre perl -n -0777e 'print if /^\s*-[^<]*<-\s*\(*\s*(?:\/\/.*$\s*)+/mx' numeric.li Il m'affiche _tout_ le fichier. J'ai bien essayé des configurations différentes, genre tester -n ou -p, mettre ou pas -0777 avec les modificateurs m et x, cela dans toutes les combinaisons possibles. Mais je n'obtiens rien que soit une ligne vide, soit l'intégralité du fichier. Encore une exemple pour la route. Je met en italique ce que l'utilitaire regexp-coach (utilitaire permettant de tester une regexp au format perl, et surlignant ce qui matche dans la chaîne cible ` _ - to_hexadecimal_format s:INTEGER :STRING <- // Convert the hexadecimal view of `self' into a new allocated // STRING. For example, if `self' is -1 the new STRING is // "FFFFFFFF" on a 32 bit machine. // Note: see also `to_hexadecimal_in' to save memory. ( _+ result:STRING; result := STRING.create 8; to_hexadecimal_in result format s; result ); _ - to_hexadecimal_in buffer:STRING <- // Append in `buffer' the equivalent of `to_hexadecimal'. No new STRING // creation during the process. _( + val:SELF; + i,old_count:INTEGER; ? {buffer!=NULL}; (self==0).if { buffer.extend '0'; } else { i := buffer.count + 1; val := self; {val != 0}.while_do { //JBJB buffer.extend ((val & 15).hexadecimal_digit); val := val >> 4; }; old_count := buffer.count; {i >= old_count}.until_do { buffer.swap i with old_count; old_count := old_count - 1; i := i + 1; }; }; );`