2016-11-23 53 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: $!";