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,
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Repeating a substitution
by Eily (Monsignor) on Jan 09, 2018 at 11:32 UTC | |
by ikegami (Patriarch) on Jan 09, 2018 at 18:12 UTC | |
by Eily (Monsignor) on Jan 09, 2018 at 18:15 UTC | |
|
Re: Repeating a substitution
by shmem (Chancellor) on Jan 09, 2018 at 16:43 UTC | |
|
Re: Repeating a substitution
by LanX (Saint) on Jan 09, 2018 at 12:12 UTC | |
|
Re: Repeating a substitution in a oneliner (write a program, trt)
by beech (Parson) on Jan 10, 2018 at 01:41 UTC |