use warnings; use strict; use Data::Dumper; while () { if (/logger\s+"([^"]*)",(\w+),(.*)/s) { print "logger " . ('X' x length $1) . ',' . ('X' x length $2) . ",$3"; } elsif (/logger\s+([^,]*),"([^"]*)"(,?.*)/s) { print "logger $1," . ('X' x length $2) . "$3"; } elsif (/logger\s+([^,]*),(\w+)(,?.*)/s) { print "logger $1," . ('X' x length $2) . "$3"; } } __DATA__ logger abc@def,"werty^%$&" logger ab$Łef,12trsgh logger "765)(?>jh",hhhhhh,joebloggs logger "7,)(?>jh",yyyyyyy,fredbloggs #### logger abc@def,XXXXXXXXX logger ab$Łef,XXXXXXX logger XXXXXXXXX,XXXXXX,joebloggs logger XXXXXXXX,XXXXXXX,fredbloggs