字段perl内的替换

时间:2014-08-19 16:36:32

标签: regex perl join split

我需要解析许多分隔文件,我有一个问题。在while循环中,如何在字段中进行替换?让我举一些示例代码和数据。

数据示例:

Word,Name,Number,You/Me,Data
Hello,Josh,123,Me,Data
Hello,Joe,222,Me,Data

目标:

在这个例子中,我想做的是在$ [2]和$ [3]上进行替换。

换句话说,字段$ [2]将是数字字段。 $ [3]将是你/我的字段。

我的代码中包含的内容是:

my @F = split;

while (<>) {
    if ($F[3] =~ /^You$/ print "Me";) next;
    if ($F[2] =~ /^222$/ print "P";) next;
    if ($F[2] =~ /^123$/ print "P";) next;
    print @F;
}

我似乎无法找到在特定字段中进行替换的正确语法,并希望有人会有建议。我的结果的目标如下。

期望的结果:

Word,Name,Number,You/Me,Data
Hello,Josh,P,Me,Data
Hello,Joe,P,Me,Data

我只想在指定的字段上执行替换,并保留其他所有内容。

此外,我可能有一个场景,我希望通过完全不同的东西划分某些字段,同时保留其他所有字段。我也想使用标量。

数据示例:

Word,Name,Number,You/Me,Data
Hello,Josh,123,Me,Data
Hello,Joe,222,Me,Data

期望的结果:

Word,Name,Number,You/Me,Data
Hello,Josh,P-Me,Data
Hello,Joe,P-Me,Data

标量示例

my $numbers = qw/222|123/;
    my @F = split;

    while (<>) {
        if ($F[3] =~ /^You$/ print "Me";) next;
        if ($F[2] = /^$numbers$/ print "P";) next;
        join ("-",$[2],$[3]);
        print @F;
    }

所以最后,我想知道如何在字段中替换,使用不同的分隔符连接特定字段,并在这种分割/连接脚本中实现标量。

2 个答案:

答案 0 :(得分:1)

perl脚本可以满足您的需求。

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

my $file = "file";

local @ARGV = $file;
local $^I = '.bak';

my $numbers = qr/^(?:222|123)$/;
while (<>) {
    print and next if /^\s+$/ or $.==1;
    my @flds = split /,/;
    $flds[2] = "P" if $flds[2] =~ $numbers; 
    $flds[3] = "Me" if $flds[3] eq "You";  
    print join ",", @flds[0,1], join ("-", @flds[2,3]), @flds[4..$#flds];
}

#unlink "$file$^I";

输出:

Word,Name,Number,You/Me,Data

Hello,Josh,P-Me,Data

Hello,Joe,P-Me,Data

我们使用$^I变量进行就地更改,同时创建扩展名为.bak的原始文件的备份。我们在,上拆分了这一行,并填充了一个名为@flds的数组。

然后我们进行两次检查,如果成功,我们会对字段进行更改。检查完成后,我们打印出每个成功测试都有修改字段的数组。

unlink已被注释掉。如果您不想备份文件,可以取消注释。

如果文件中没有任何空行或者您不希望将它们保留在输出中,则可以删除print and next unless /\S/;行。

答案 1 :(得分:0)

你想改变&#34;你&#34;到了#34;我&#34;?您想要的结果表明您不想改变,但您的代码则不然。

我认为您可以使用$F[2] =~ s/^123$/P/。见perldoc perlre

如果您想要就地版,也许您想使用$^I变量。 见perldoc perlval