2015-10-23 5 views
-3

У меня есть необходимость в Perl, чтобы заменить раздел одной строки самой другой. :-) Это нужно сделать для нескольких пар строк.Perl regex заменить часть одной строки на другую часть

Например, мне нужно заменить

"/root_vdm_2/fs_clsnymigration" 

в

/root_vdm_2/fs_clsnymigration/CLSNYMIGRATION/NY_HQ_S1 

с

rfsn_clsnymigration 

, так что я в конечном итоге с

/rfsn_clsnymigration/CLSNYMIGRATION/NY_HQ_S1 

(без ведущей «/ root_vdm_2» части) ... но я достаточно лишен сна, чтобы потерять из виду, как это осуществить.

Помощь?

+0

Может '$ строка = ~ s/\/root_vdm_2 \ // \/rfsn_clsnymigration \ // g; 'не делал perl раньше, но, глядя на некоторые документы, выглядит так. – chris85

ответ

0

Попробуйте это регулярное выражение:

^\/root_vdm_2\/fs_clsnymigration 

Замены с:

\/rfsn_clsnymigration 

пример:

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

Выход:

/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; 

Выход:

/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 
+2

Я бы предположил, что, поскольку у вас есть'/'в шаблоне, вы бы лучше использовать что-то еще в качестве разделителей регулярных выражений. – Sobrique

+0

Спасибо за предложение. К сожалению, это не помогает, потому что мне нужно проанализировать _all_ '/ root_vdm_2/fs_clsnymigration' и заменить его на' rfsn_clsnymigration' программно.Ваш пример показывает мне отличный способ заменить эту пару строк, но данные меняются от строки к строке (отсюда и мой комментарий о «нескольких парах строк».) –

+0

@TyYoung вы можете разместить достаточное количество данных вместе с ожидаемым результатом? –

-1

Моя задача заключалась в замене часть в $ string1 со всеми $ строка2, расколе на запятых.

/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 

Трудность я увидел, был первоначально как заменить /root_vdm_2/fs_clsnymigration с rfsn_clsnymigration, и я позволил себе думать, что регулярное выражение является наилучшим подходом.

Хотя гораздо менее красноречив, это получает работу:

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"; 
     } 

... что дает что-то вроде этого:

 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 
+0

'@pathparts [0]' должен быть '$ pathparts [0]', поскольку вы имеете в виду скаляр. –

0
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 
Смежные вопросы