Regexp multiline

Pàgina inicial

Reply to this message
Autor: Dominique Fournier
Data:  
A: ML Guilde
Assumpte: Regexp multiline
Bonjour,

Je me bagarre avec une regexp multiline qui me résiste. Un gourou perl
aurait-il la solution ?

Je parcours des logs de fichiers par un programme et je souhaite 
supprimer la ligne contenant une chaine PLUS la ligne suivante.
Exemple : le log contient :
Mar 13 00:05:16 pfsense1 pf: 00:00:00.000133 rule 122/0(match): block in 
on em0: (tos 0x0, ttl 102, id 256, offset 0, flags [none], proto TCP 
(6), length 40)
Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 > 
147.173.21.253.1433: Flags [S], cksum 0x3cd3 (correct), seq 294715392, 
win 16384, length 0
Mar 13 00:05:16 pfsense1 pf: 00:00:00.000021 rule 25/0(match): pass out 
on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none], proto 
TCP (6), length 40)
Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 > 
147.173.21.206.1433: Flags [S], cksum 0xff73 (correct), seq 1327431680, 
win 16384, length 0
Mar 13 00:05:16 pfsense1 pf: 00:00:00.000011 rule 25/0(match): pass out 
on em2_vlan22: (tos 0x0, ttl 101, id 256, offset 0, flags [none], proto 
TCP (6), length 40)
Mar 13 00:05:16 pfsense1 pf:     218.60.128.142.6000 > 
147.173.21.182.1433: Flags [S], cksum 0xd920 (correct), seq 1971978240, 
win 16384, length 0


Je veux supprimer les lignes contenant "(match): pass " et la ligne
suivante du match.
Evidement, on garde précieusement les autres lignes...

J'ai essayé des trucs comme :
preg_grep ('#^pf: .+\(match\): pass (out|in) on (\n|.)+^pf:.+$#sm',
$logs, PREG_GREP_INVERT);
Mais cela ne matche pas.

Je suis en PHP, mais c'est un problème de regexp.

Avez-vous des idées ?

Merci

Dom