我想替换
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 +同步。我可以对代码的这一部分进行哪些更改以使其有效?
由于
答案 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)