我想使用perl在文本文件中搜索和替换,但正则表达式s ///不能按预期工作

时间:2018-04-11 12:01:39

标签: perl

我想替换

R00001,abcd xyz pqr,undef,undef,PEND

R00001,abcd xyz pqr,undef,undef,DONE

我尝试使用

 $line =~ s/(\w+,\w+,\w+,\w+),\w+/$1,"DONE"/g;

问题是abcd xyz pqr中有空格,因此无法与\ w +同步。我可以对代码的这一部分进行哪些更改以使其有效?

由于

4 个答案:

答案 0 :(得分:2)

为什么不简单
$line =~ s/PEND/DONE/;

如果你想保留一个与你使用的正则表达式类似的正则表达式,你可以 $line =~ s/(\w+,[\w\s]+,\w+,\w+),\w+/$1,"DONE"/g;

答案 1 :(得分:2)

从架子上拉出一个轮子:

use Modern::Perl;
use Text::CSV::Easy qw( csv_parse );

while (<DATA>) {
    my @row = csv_parse $_;
    $row[ 4 ] = 'DONE' if $row[ 4 ] eq 'PEND';
    say join',', @row;
}

__DATA__
R00001,abcd xyz pqr,undef,undef,PEND

输出:

R00001,abcd xyz pqr,undef,undef,DONE

答案 2 :(得分:1)

如果要在任何字段中允许空格,可以执行以下操作:

$line =~ s/^((?:[\w\s]+,){4})[\w\s]+$/$1DONE/g;

答案 3 :(得分:1)

我的问题是为什么我们应该为这些空间烦恼呢。在before关键字中有一个运算符,,因此它可能是简单的替换。

$line=~s/\,([^\,]*)$/\,DONE/g;

正则表达式解释:

$line=~s/\, #Check the last comma
           ([^\,]*)  #Rest of the words (PEND)
                     $ # End of the line 
              /\,DONE/g; #Replace whatever you want (DONE)