Я хочу выполнить поиск и заменить текстовый файл с помощью perl, но выражение регулярного выражения s /// не работает должным образом

Я хочу заменить

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 +. Какие изменения я могу внести в эту часть кода, чтобы она работала?

Спасибо

$line=~s/\,([^\,]*)$/\,DONE/g;
ssr1012 11.04.2018 15:30
1
1
65
4

Ответы 4

почему бы просто не
$line =~ s/PEND/DONE/;

если вы хотите сохранить регулярное выражение, подобное тому, которое вы использовали, вы можете
$line =~ s/(\w+,[\w\s]+,\w+,\w+),\w+/$1,"DONE"/g;

Если вы хотите разрешить пробелы в любом из ваших полей, вы можете сделать это:

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

Мой вопрос в том, почему мы должны беспокоиться о пробелах. У вас есть оператор , в ключевом слове 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)

Нужен /x, верно?

cxw 11.04.2018 15:42

Да. Однако просто краткая информация для понимания регулярного выражения.

ssr1012 11.04.2018 16:01

Снимаем колесо с полки:

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

Другие вопросы по теме