perl oneliner搜索替换模式

时间:2017-01-10 23:42:35

标签: regex perl

我有数千行,其中一些包含以下内容:

id_s,title_dk
KKS2826,"Søslag ved Øland og Gulland, 1564",12312,2x2
KKS935,"Vignet til Edvard Brandes, afhandling om Johan Wiehe", 1233, 4x4

我正在寻找一个Perl单行程序,我可以删除引号中可能出现的任何逗号(第二列)。但显然不是其他人,畏缩他们是分界符。

所以期望的输出是:

id_s,title_dk
KKS2826,"Søslag ved Øland og Gulland 1564",12312,2x2
KKS935,"Vignet til Edvard Brandes afhandling om Johan Wiehe", 1233, 4x4

我一直在玩这个:perl -ne 's/(?<!,),//g; print;' 但我无法弄清楚如何保留其他逗号。

2 个答案:

答案 0 :(得分:3)

轻松使用Text::CSV_XS

perl -CS -MText::CSV_XS=csv -we '
    my $aoa = csv(in => shift, allow_whitespace => 1);
    $_->[1] =~ s/,//g for @$aoa;
    csv(in => $aoa, out => *STDOUT, always_quote => 0);
    ' input.csv > output.csv

答案 1 :(得分:0)

试试这个衬垫

perl -p -e  's/"([^"]*)"/my $m=$1;$m=~ s:,::g; $m /eg' file.txt

根据Borodin评论脚本更新。因为上面的脚本也会删除"

perl -p -e  's/ (?<=") ([^"]*) (?<=")/$1=~ s:,::rg; /xeg' file.txt

在第二部分中,我使用积极的向前看并向后看。使用非破坏性修饰符(r)。非破坏性修饰符仅适用于&gt; 5.14。