Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: Multiline Regex replacement in Multiline file

by Athanasius (Archbishop)
on Sep 15, 2014 at 07:34 UTC ( [id://1100564]=note: print w/replies, xml ) Need Help??


in reply to Multiline Regex replacement in Multiline file

Hello akamboj84, and welcome to the Monastery!

You first create a dictionary mapping each search regex to its corresponding replacement text. Then, before searching, you change the search regex in two ways: (1) by concatenating all the search strings with |; (2) by applying the qr operator. So when you get to the substitution, if a match is found the dictionary lookup $dic{$matchkey} is guaranteed to fail, since the new value of $matchkey does not match any of the keys in the %dic hash!

But even when this problem has been fixed,1 you will still be replacing the whole of the first user entry, including everything through to the final "engineer", with the single text REPLACE1. I doubt this is what you want. For the monks to help you further, you will need to specify the output you expect/desire.

Update: 1For example:

use strict; use warnings; my @regexen = ( q{\s+user\s"[^"]+"\s+password\s"[^"]+"\s+hash2\s+access(\s+console +){2}} . q{(\s+new-password-at-login)?} . q{(\s+member\s"(default|engineer|networktest)"){2}(\s+exit){0,2}}, q{\s+user\s"[^"]+"\s+password\s"[^"]+"\s+hash2\s+access(\s+console +){2}} . q{(\s+new-password-at-login)?} . q{(\s+member\s"(default|READ-ONLY)"){2}(\s+exit){0,2}}, q{\s+user\s"[^"]+"\s+password\s"[^"]+"\s+hash2\s+access} . q{(\s+(console|snmp|li)){3}\s+console(\s+new-password-at-login)?} +. q{(\s+member\s"(default|LI|li-prof1)"){2}(\s+exit){0,2}}, ); my $n = 1; my %dic = map { qr{$_} => 'REPLACE' . $n++ } @regexen; my $line = join "", <DATA>; for my $matchkey (keys %dic) { $line =~ s%$matchkey%$dic{$matchkey}%g; } print $line; __DATA__ user "testuser1" password "08Cl3V.leJKU/GskqArA0Yp4MFo" hash2 access console console new-password-at-login member "default" member "engineer" user "v-test" password "VCp0GjSBK/KiWW.PgkQp7swXVMZ" hash2 access console console new-password-at-login member "default" member "READ-ONLY"

Output:

18:42 >perl 1011_SoPW.pl REPLACE1REPLACE2 18:43 >

Note that I had to add two doublequote characters to the second regex to get it to match.

Hope that helps,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Multiline Regex replacement in Multiline file
by akamboj84 (Novice) on Sep 16, 2014 at 01:11 UTC
    Hi Athanasius, Thanks for that stuff. But I already have a working code like this. But I wanted to avoid the below "for" loop and instead do multi regex replacement.
    for my $matchkey (keys %dic) { $line =~ s%$matchkey%$dic{$matchkey}%g; }
    Also for each regex I have seperate set of pre defined replacement String not like Replace1 or Replace2( that was just used as an example) and I want replace the complete matched string with predefined Replacement String.

      Hello again, akamboj84,

      But I wanted to avoid the below "for" loop and instead do multi regex replacement.

      ...as my regex file is a long one and also i need to process a lot of files, so its kind of time/cpu consuming. I want to get rid of "for" loop...
      Re^3: Multiline Regex replacement in Multiline file

      There may be some clever way to do this using Perl’s extended regular expression patterns, but if so I haven’t found it. But deployment of the for loop can likely be made much more efficient. At present, the regexen are being applied to the whole input file; but if you can read in a paragraph at a time, this will save a lot of processing, as there will then be no need for the regex engine to re-search those parts of the input string that have already been matched and replaced:

      Hope that helps,

      Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

        Hi Athanasius, the only solution i was looking for was to avoid loops, otherwise i am already doing it via looping through Keys and replacing matching string. I am not an expert but this is what i have been doing already :)

        my $line=join "", <F>; foreach $k (keys %dic) { $line =~ s/$k/$dic{$k}/gism; } print $line;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1100564]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (4)
As of 2024-04-24 03:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found