search and replace string from a script

System root at ttsi.lonestar.org
Thu Apr 25 14:07:51 AEST 1991


In article <1991Apr23.215804.8366 at iwarp.intel.com> merlyn at iwarp.intel.com (Randal L. Schwartz) writes:
>In article <1991Apr23.180034.7349 at progress.com>, root at progress (Root of all Evil) writes:
>| Is there any way within ex (or some other text processing utility) to
>| access the nth occurrence of a pattern?  What I'd like to do is search
>| a file for the nth occurrence of a pattern and then change that pattern
>| but no others.  I've tried using ex:
>| 
>| ex -s FILE << QUIT
>| /STRING1/n s/STRING1/STRING2/
>| wq!
>| QUIT
>| 
>| but this only places me n lines after the first occurrence of STRING1.
>| Any ideas?  I'd like to avoid writing to a temporary file.
>
>perl -pe '/STRING1/ && (++$n == 20) && s/STRING1/STRING2/' <in >out
>
>OK, so the syntax is cryptic; do it C-like if you want:
>
>perl -pe 'if (/STRING1/ && (++$n == 20)) { s/STRING1/STRING2/; }' <in >out
>
>or even (more verbosely):
>
>perl -pe 'if (/STRING1/) { s/STRING1/STRING2/ if ++$n == 20; }' <in >out
>
>(well, maybe not more verbosely, then... :-)  Or even:
>
>perl -pe 's/STRING1/STRING2/ if /STRING1/ && (++$n == 20);' <in >out
>
>All of these presume "20" is your magic occurance.  Season to taste.
>
>print "Just another Perl hacker," # Perl is available from all GNU sites...

These all presume only one occurrence or first occurrence per line.
Is that the requirement?  How would you handle counting multiple 
occurrences per line in perl?  Thanks for posting the solutions above.


-- 
Mark S. Evans                 Tandem Telecommunications Systems Inc.
Phone: 214-516-6201           850 E. Central Parkway
Fax:   214-516-6801           Plano, TX 75074
Mail:  mse at ttsi.lonestar.org



More information about the Comp.unix.shell mailing list