Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!newstop!texsun!dinosaur!ttsi!root From: root@ttsi.lonestar.org (System) Newsgroups: comp.unix.shell Subject: Re: search and replace string from a script Keywords: search replace script Message-ID: <1991Apr25.040751.1991@ttsi.lonestar.org> Date: 25 Apr 91 04:07:51 GMT References: <1991Apr23.180034.7349@progress.com> <1991Apr23.215804.8366@iwarp.intel.com> Organization: Tandem Telecommunications Systems Inc. Plano, Tx. Lines: 43 In article <1991Apr23.215804.8366@iwarp.intel.com> merlyn@iwarp.intel.com (Randal L. Schwartz) writes: >In article <1991Apr23.180034.7349@progress.com>, root@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/' out > >OK, so the syntax is cryptic; do it C-like if you want: > >perl -pe 'if (/STRING1/ && (++$n == 20)) { s/STRING1/STRING2/; }' out > >or even (more verbosely): > >perl -pe 'if (/STRING1/) { s/STRING1/STRING2/ if ++$n == 20; }' out > >(well, maybe not more verbosely, then... :-) Or even: > >perl -pe 's/STRING1/STRING2/ if /STRING1/ && (++$n == 20);' 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@ttsi.lonestar.org