perl - replace every nth (and multiples) occurrences of a character with another character

command-line, linux, perl, shell, unix

Solution

Small perl hack to solve the problem. Using the `index` function to find the commas, modulus to replace the right one, and `substr` to perform the replacement.

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 with `perl script.pl file.csv`.

Note: You can place the declaration `my $i` before the `while(<>)` loop in order to do a global count, instead of a separate count for each line. Not quite sure I understood your question in that regard.

Problem

Does anyone know any unix commands/perl script that would insert a specific character (that can be entered as either hex (ie 7C) or as the actual character (ie |)) in the position of the nth recurring occurence of a specific character. ie `perl script.pl "," 3 "|" data.txt` would replace every 3rd,6th,9th...etc comma with a pipe. So if data.txt had the following before the script was run: ``` fd,3232,gfd67gf, peas,989767,jkdfnfgjhf, dhdhjsk,267,ujfdsy,fuyds,637296,ldosi,fduy, 873,fuisouyd,try save,2837,ipoi ``` It should then have this after the script was run: ``` fd,3232,gfd67gf| peas,989767,jkdfnfgjhf| dhdhjsk,267,ujfdsy|fuyds,637296,ldosi|fduy, 873,fuisouyd|try save,2837,ipoi ```

Original source