Perl - 在第 n 个分隔符之后替换



我想在如下所示的文件行上进行替换方面获得一些帮助:

aoipp;dadada.12312;ss;1245454;Xiop;12.12;45.3;47.897;31.5;
asdfafd;14355.54664;peasd;125.1;900.2;76.897;67.456;asdfdf;
perio;777.2;ipoes;900.34;2;1980.45;870.98;67.67;

我想用,替换每个.,但只有在分隔符;第五次出现之后。其他一切都需要保持不变。所以所需的输出文件如下所示:

aoipp;dadada.12312;ss;1245454;Xiop;12,12;45,3;47,897;31,5;
asdfafd;14355.54664;peasd;125.1;900.2;76,897;67,456;asdfdf;
perio;777.2;ipoes;900.34;2;1980,45;870,98;67,67;

我主要对在perl中执行此操作感兴趣,因此我可以将其合并到更大的程序中,但是也欢迎bash/awk中的任何解决方案。提前谢谢。

这个尴尬的单行应该适合你:

awk -F';' -v OFS=";" '{for(i=6;i<=NF;i++)gsub("[.]",",",$i)}7' file

它从第 6 个字段(;分开)开始,对于每个字段,将所有.替换为 ,

使用数据进行测试:

kent$  cat f
aoipp;dadada.12312;ss;1245454;Xiop;12.12;45.3;47.897;31.5;
asdfafd;14355.54664;peasd;125.1;900.2;76.897;67.456;asdfdf;
perio;777.2;ipoes;900.34;2;1980.45;870.98;67.67;
kent$  awk -F';' -v OFS=";" '{for(i=6;i<=NF;i++)gsub("[.]",",",$i)}7' f
aoipp;dadada.12312;ss;1245454;Xiop;12,12;45,3;47,897;31,5;
asdfafd;14355.54664;peasd;125.1;900.2;76,897;67,456;asdfdf;
perio;777.2;ipoes;900.34;2;1980,45;870,98;67,67;

我使用数组切片@fields[ 5 .. $#fields ]来仅访问要更改的元素。

#!/usr/bin/perl
use warnings;
use strict;
my @input = qw( aoipp;dadada.12312;ss;1245454;Xiop;12.12;45.3;47.897;31.5;
                asdfafd;14355.54664;peasd;125.1;900.2;76.897;67.456;asdfdf;
                perio;777.2;ipoes;900.34;2;1980.45;870.98;67.67;
              );
my @expected = qw( aoipp;dadada.12312;ss;1245454;Xiop;12,12;45,3;47,897;31,5;
                   asdfafd;14355.54664;peasd;125.1;900.2;76,897;67,456;asdfdf;
                   perio;777.2;ipoes;900.34;2;1980,45;870,98;67,67;
                 );
sub process {
    my (@input) = @_;
    my @output;
    for my $line (@input) {
        my @fields = split /;/, $line;
        s/./,/ for @fields[ 5 .. $#fields ];
        push @output, join ';', @fields, q();
    }
    return @output
}
use Test::More tests => 1;
is_deeply(process(@input), @expected);
while (my $line = <DATA>) {
    if ($line =~ /^(?:[^;]*;){5}/) {
        substr($line, $+[0]) =~ y/./,/;
    }
    print $line;
}
__DATA__
aoipp;dadada.12312;ss;1245454;Xiop;12.12;45.3;47.897;31.5;
asdfafd;14355.54664;peasd;125.1;900.2;76.897;67.456;asdfdf;
perio;777.2;ipoes;900.34;2;1980.45;870.98;67.67;
perl -pe 's/(.*?;){6}K(.*)/$2 =~ s!.!,!rg /ge'
  1. 跳过所有内容,直到第 6 ;(.*?;){6}K ),
  2. 并替换 . ,到行的其余部分 ( $2 =~ s!.!,!rg
  # this should do your work
  sed -i 's/;/,/6g' filename
  cat filename
  aoipp;dadada.12312;ss;1245454;Xiop;12.12,45.3,47.897,31.5,
  asdfafd;14355.54664;peasd;125.1;900.2;76.897,67.456,asdfdf,
  perio;777.2;ipoes;900.34;2;1980.45,870.98,67.67,

相关内容

  • 没有找到相关文章

最新更新