2016-11-23 87 views
-1

我想寫一個perl腳本,用幾行代替幾行文本,我是perl新手,感謝任何幫助。perl正則表達式多行

需要更換

'ENTITLEMENT_EVS_V', 
NULL, 
NULL, 

'ENTITLEMENT_EVS_V', 
ENTITLEMENT_CATEGORY_CODE, 
6, 

我不能這樣做,特別是正則表達式的一部分。我試過很多東西,但劇本目前爲:

#!/usr/bin/env perl 
my ($lopen_fh, $lwrite_fh); 

# my $l_reg_evs = qq{ 
#'ENTITLEMENT_EVS_V', 
#NULL, 
#NULL, 
#}; 
my $l_reg_evs = qr/(\'ENTITLEMENT_EVS_V\', 
        NULL, 
        NULL, 
        )/; 


     my $l_evs=qq{ 
        'ENTITLEMENT_EVS_V', 
         ENTITLEMENT_CATEGORY_CODE, 
         6, 
        }; 

open ($lopen_fh, '<', "/home/cbdev2/imp/dev/src/deli/entfreeunits/config/entfreeunits/stubs/DirectVariables_evEntlCategory.exp") or die $!; 
open ($lwrite_fh, '>', "/home/cbdev2/imp/dev/src/deli/entfreeunits/config/entfreeunits/stubs/DirectVariables_evEntlCategory.new.exp") or die $!; 

while(<$lopen_fh>) { 
    $_ =~ s/$l_reg_evs/$l_evs/m; 
    print $lwrite_fh $_; 
} 

close $lopen_fh; 
close $lwrite_fh; 
+3

通過讀取行​​的文件行,你永遠無法看到整個字符串替換。 – choroba

回答

1

我想我會寫這樣的東西。它期望的路徑,輸入文件作爲在命令行上的參數,並且輸出結果到stdout

它要求所有以下的爲真

  • 塊的第一行到用於搜索並且將被替換的塊總是相同

  • 線在所述塊的數量來搜索和塊被替換總是相同

  • 輸入文件總是包含第一林e的塊準確搜索一次

  • 無需檢查塊中第一個之後的文件中的行是否爲NULL,,並且只需找到第一行並刪除以下內容就足夠了lines any whatever they contain

它通過讀取輸入文件並將其複製到標準輸出來工作。如果遇到包含替換塊第一行的行,則它讀取並丟棄行,直到讀取的行數等於替換塊的大小。然後在替換塊中的文本打印到stdout和繼續複印

use strict; 
use warnings 'all'; 
no warnings 'qw'; # avoid warning about commas in qw// 

my @replacement = qw/ 
    'ENTITLEMENT_EVS_V', 
    ENTITLEMENT_CATEGORY_CODE, 
    6, 
/; 

open my $fh, '<', $ARGV[0]; 

while (<$fh>) { 
    if (/$replacement[0]/) { 
     <$fh> for 1 .. $#replacement; 
     print "$_\n" for @replacement; 
    } 
    else { 
     print; 
    } 
} 

能正常工作與我創建了一些樣本數據,但我沒有辦法知道上面列出的規定是否適用於您的實際數據。我敢肯定,你讓我知道,如果有什麼需要調整

+0

我用第二個,因爲它似乎更容易: –

+0

@SwarnaGowri:第二個?我不清楚你的意思。 – Borodin

+0

我的意思是你的回覆:-) –

2

我不太清楚你正在嘗試做的,但我想你的問題的本質提煉成一個自包含的腳本。在一個真正的程序中,你會閱讀和分析變量名稱到類別和代碼的映射,但在這裏,我只是要從字符串中讀取數據。其目的是爲了表明該任務可以在不sl files文件的情況下完成。

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $entitlement_map_file = <<EOF_MAP_FILE; 
'ENTITLEMENT_EVS_V' 
ENTITLEMENT_CATEGORY_CODE 
6 
EOF_MAP_FILE 

my $entitlement_input_file = <<EOF_INPUT_FILE; 
'ENTITLEMENT_EVS_V', 
NULL, 
NULL, 
EOF_INPUT_FILE 

# read and parse the file containing mapping of 
# variables to category names and codes 

open my $map_fh, '<', \$entitlement_map_file 
    or die $!; 

my %map; 

while (my $var = <$map_fh>) { 
    chomp $var; 
    chomp(my $mnemonic = <$map_fh>); 
    chomp(my $code = <$map_fh>); 
    @{ $map{$var} }{qw(mnemonic code)} = ($mnemonic, $code); 
} 

close $map_fh; 

# read the input file, look up variable name in the map 
# if there, follow with category name and code 
# skip two lines from input, continue where you left off 

open my $in, '<', \$entitlement_input_file 
    or die $!; 

while (my $var = <$in>) { 
    $var =~ s/,\s+\z//; 
    next unless exists $map{ $var }; 

    for (1 .. 2) { 
     die unless <$in> =~ /^NULL/; 
    } 

    print join(",\n", $var, @{ $map{$var} }{qw(mnemonic code)}), "\n"; 
} 

close $in; 

輸出:

'ENTITLEMENT_EVS_V', 
ENTITLEMENT_CATEGORY_CODE, 
6

歸納,這是作爲練習留給讀者。

-1

這裏就是我所做的:

#!/usr/bin/env perl 
my ($lopen_fh, $lwrite_fh); 
my $l_stub_dir = "/home/cbdev2/imp/dev/src/deli/entfreeunits/config/entfreeunits/stubs"; 
my $l_stub = "DirectVariables_evEntlCategory.exp"; 
my $l_filename = "$l_stub_dir/$l_stub"; 
my $search_evs = 'ENTITLEMENT_EVS_V'; 
my $search_tre = 'ENTITLEMENT_TRE_V'; 

my @replacement_evs = qw/ 
    'ENTITLEMENT_EVS_V', 
    ENTITLEMENT_CATEGORY_CODE, 
    6, 
    /; 
my @replacement_tre = qw/ 
    'ENTITLEMENT_TRE_V', 
    ENTITLEMENT_CATEGORY_CODE, 
    6, 
    /; 

open ($lopen_fh, "<$l_filename") or die $!; 
open ($lwrite_fh, ">$l_filename.new") or die $!; 

while(<$lopen_fh>) { 
    if (/'ENTITLEMENT_EVS_V'/) { 
     <$lopen_fh> for 1 .. $#replacement_evs; 
     print $lwrite_fh " $_\n" for @replacement_evs; 
    } 
    elsif (/'ENTITLEMENT_TRE_V'/) { 
     <$lopen_fh> for 1 .. $#replacement_tre; 
     print $lwrite_fh " $_\n" for @replacement_tre; 
    } 
    else { 
     print $lwrite_fh $_; 
    } 
} 

close $lopen_fh; 
close $lwrite_fh; 

unlink($l_filename) or die "Failed to delete $l_filename: $!"; 
link("$l_filename.new", $l_filename) or die "Failed to copy $l_filename"; 
unlink("$l_filename.new") or die "Failed to delete $l_filename.new: $!";