简体   繁体   中英

Perl regex to replace part of one string with a portion of another

I have a need in Perl to replace a section of one string with most of another. :-) This needs be done for multiple pairs of strings.

For example, I need to replace

"/root_vdm_2/fs_clsnymigration"

within

/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1

with

rfsn_clsnymigration

so that I end up with

/rfsn_clsnymigration/CLSNYMIGRATION/NY_HQ_S1

(without the leading "/root_vdm_2" part) ... but I am sufficiently sleep-deprived to have lost sight of how to accomplish this.

Help ?

Try this regex:

^\/root_vdm_2\/fs_clsnymigration

Substitute with:

\/rfsn_clsnymigration

example:

$string = "/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1";
$string=~s/^\/root_vdm_2\/fs_clsnymigration/\/rfsn_clsnymigration/;
print $string;

Output:

/rfsn_clsnymigration/CLSNYMIGRATION/NY_HQ_S1

EDIT 1

$string = "/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1/LISU,rfsn_clsnymigration
/root_vdm_2/fs_users/users/Marketing,rfsw_users
/root_vdm_3/fs_sandi/sandi_users,rfsw_sandi
/root_vdm_3/fs_pci/Analytics,rfsw_pci
/root_vdm_4/fs_camnt01/camnt01/AV,rfsw_camnt01
/root_vdm_1/fs_stcloud01/sfa,rfss_stcloud01
/root_vdm_3/fs_stcloud03/data4,rfss_stcloud03
/root_vdm_2/fs_stcloud02/depart1,rfss_stcloud02";
$string=~s/^\/root_vdm_.\/fs_[^\/]*/\/rfsn_clsnymigration/gm;
print $string;

Output:

/rfsn_clsnymigration/CLSNYMIGRATION/NY_HQ_S1/LISU,rfsn_clsnymigration
/rfsn_clsnymigration/users/Marketing,rfsw_users
/rfsn_clsnymigration/sandi_users,rfsw_sandi
/rfsn_clsnymigration/Analytics,rfsw_pci
/rfsn_clsnymigration/camnt01/AV,rfsw_camnt01
/rfsn_clsnymigration/sfa,rfss_stcloud01
/rfsn_clsnymigration/data4,rfss_stcloud03
/rfsn_clsnymigration/depart1,rfss_stcloud02
use strict;
use warnings;

while (<DATA>) {
    chomp;
    my ($lhs, $rhs) = split(/,/, $_, 2);
    my @parts = split(/\//, $lhs);
    splice(@parts, 1, 2, $rhs);
    print join('/', @parts) . "\n";
}

__DATA__
/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1/LISU,rfsn_clsnymigration
/root_vdm_2/fs_users/users/Marketing,rfsw_users
/root_vdm_3/fs_sandi/sandi_users,rfsw_sandi
/root_vdm_3/fs_pci/Analytics,rfsw_pci
/root_vdm_4/fs_camnt01/camnt01/AV,rfsw_camnt01
/root_vdm_1/fs_stcloud01/sfa,rfss_stcloud01
/root_vdm_3/fs_stcloud03/data4,rfss_stcloud03
/root_vdm_2/fs_stcloud02/depart1,rfss_stcloud02

My challenge was to replace part of $string1 with all of $string2, split on the commas.

/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1/LISU,rfsn_clsnymigration
/root_vdm_2/fs_users/users/Marketing,rfsw_users
/root_vdm_3/fs_sandi/sandi_users,rfsw_sandi
/root_vdm_3/fs_pci/Analytics,rfsw_pci
/root_vdm_4/fs_camnt01/camnt01/AV,rfsw_camnt01
/root_vdm_1/fs_stcloud01/sfa,rfss_stcloud01
/root_vdm_3/fs_stcloud03/data4,rfss_stcloud03
/root_vdm_2/fs_stcloud02/depart1,rfss_stcloud02

The difficulty I saw initially was how to replace /root_vdm_2/fs_clsnymigration with rfsn_clsnymigration , and I allowed myself to think that a regexp was the best approach.

Although far less eloquent, this gets the job done:

foreach $line (@lines) {
        chop $line;
        ($orig,$replica) = split /\,/, $line;
        chop substr $orig, 0, 1;
        @pathparts = split /\//, $orig;
        $rootvdm = shift @pathparts;
        @pathparts[0] = $replica;
        $newpath = "/" . join ('/', @pathparts);
        print "     here's \$newpath:$newpath\n";
        }

... which yields something like this:

     here's $newpath:/rfsn_clsnymigration/CLSNYMIGRATION/NY_HQ_S1/LISU
     here's $newpath:/rfsw_users/users/Marketing
     here's $newpath:/rfsw_sandi/sandi_users
     here's $newpath:/rfsw_pci/Analytics
     here's $newpath:/rfsw_camnt01/camnt01/AV
     here's $newpath:/rfss_stcloud01/sfa
     here's $newpath:/rfss_stcloud03/data4
     here's $newpath:/rfss_stcloud02/depart1

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM