[Perl] problème mise au point regexp

Yon anaseto at bardinflor.perso.aquilenet.fr
Dim 26 Mar 22:39:15 CEST 2017


Bonjour,

On Sun, Mar 26, 2017 at 10:15:44PM +0200, Eric DUVAL wrote:
> Bonjour,
> 
> Je dois anonymiser un fichier contenant des lignes de la forme:
> (STRING == je ne peux pas transmettre les vraies données)
> Aucune des lignes ne se ressemblent. Cette ligne est donnée à titre
> d'exemple.
> Le nombre de var=value peut varier de 0 à n.
> 
> file.log:Mar 21 19:19:57 STRING1 STRING2 "STRING3" - - [21/Mar/2017:19:19:57
> +0100] "/uri?var1=value1&var2=value2&var3=value3" 200 0.037-0.033=0.004 POST
> 484 - "STRING4" "STRING5" "STRING6"
> 
> Et ressortir avec des lignes de la forme:
> 
> file.log:Mar 21 19:19:57 STRING1 STRING2 "STRING3" - - [21/Mar/2017:19:19:57
> +0100] "/uri?var1=xxx&var2=xxx&var3=xxx" 200 0.037-0.033=0.004 POST 484 -
> "STRING4" "STRING5" "STRING6"
> 
> ou de la forme
> 
> file.log:Mar 21 19:19:57 STRING1 STRING2 "STRING3" - - [21/Mar/2017:19:19:57
> +0100] "/uri" 200 0.037-0.033=0.004 POST 484 - "STRING4" "STRING5" "STRING6"
> 
> Après de multiples tentatives, je n'arrive à mettre au point l'expression
> régulière qui va bien :-(
> 
> Le code perl est de la forme:
> (J'ai séparé les expressions pour la clarté de l'exemple)
> 
> [...]
> while( <in> ) {
> 	s/(\?.*)=.*([&\"])/${1}=xxx${2}/;
>         s/(&.*)=.*([&\"])/${1}=xxx${2}/;
> }
> [...]
> 
> J'ai essayé des expressions plus ou moins complexes mais sans résultats.
Un truc vite-fait, si j'ai bien compris:

    s{(?<=[?&]) ([^?&=]+) = ([^&"]+) (?=["&])}{$1=xxx}xg;

Après, peut-être que ça vaut le coup d'extraire juste l'url, et
d'utiliser par exemple le module URI avec un $uri->queryform, puis après
reconstruire une nouvelle url.

-- 
Yon


Plus d'informations sur la liste de diffusion Perl