A user asked for a (awk or similar) one-liner that would replace a separator by a different one in a file, but only the first N separators should be replaced.
For small Ns, it's easiest to repeat the substitution:
perl -pe 's/,/|/;s/,/|/;s/,/|/'
But, what should one do when they want to replace the first 10 separators?
My first idea was to use a for loop:
perl -pe 's/,/|/ for 1 .. 10' # Oops!
Unfortunately, it doesn't work, as the for creates another local $_ and the substitution happens to the numbers, not the input.
So, my next idea was to use a counter with /e:
perl -pe 's/,/$i++<10 ? "|" : ","/ge'
It works, but is ugly and hard to explain to someone not familiar with Perl.
Another way is to tie the two $_ variables together by aliasing the outer $_ by the inner one:
Again, this works only for small number of substitutions.perl -pe 's/,/|/ for $_, $_'
But, we can generalize a list of the same things: we can use the x operator in list context! It's short, readable, and follows the DRY principle:
perl -pe 's/,/|/ for ($_) x 10'
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
In reply to Repeating a substitution by choroba
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |