perl - 用另一个字符替换每个第n个(和多个)字符的出现次数

too*_*oop 3 unix linux shell perl command-line

有没有人知道任何unix命令/ perl脚本会插入特定字符(可以输入为十六进制(即7C)或实际字符(即|))在特定字符的第n次重复出现的位置.即perl script.pl "," 3 "|" data.txt 会取代所有的3,6,9日...等逗号与管道.

因此,如果在脚本运行之前data.txt具有以下内容:

fd,3232,gfd67gf,
peas,989767,jkdfnfgjhf,
dhdhjsk,267,ujfdsy,fuyds,637296,ldosi,fduy,
873,fuisouyd,try
save,2837,ipoi
Run Code Online (Sandbox Code Playgroud)

它应该在脚本运行后具有此功能:

fd,3232,gfd67gf|
peas,989767,jkdfnfgjhf|
dhdhjsk,267,ujfdsy|fuyds,637296,ldosi|fduy,
873,fuisouyd|try
save,2837,ipoi
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 5

小perl hack解决问题.使用该index函数查找逗号,模数以替换正确的模数,并substr执行替换.

use strict;
use warnings;

while (<>) {
    my $x=index($_,","); 
    my $i = 0; 
    while ($x != -1) {
        $i++; 
        unless ($i % 3) { 
            $_ = substr($_,0,$x) ."|". substr($_,$x+1); 
        }
        $x = index($_,",",$x + 1) 
    } 
    print;
}
Run Code Online (Sandbox Code Playgroud)

运行perl script.pl file.csv.

注意:您可以my $iwhile(<>)循环之前放置声明以进行全局计数,而不是每行的单独计数.我不太清楚我在这方面理解你的问题.