Xref: utzoo comp.unix.shell:2000 comp.lang.perl:5037 Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!usc!apple!agate!ucbvax!iwarp.intel.com!news From: merlyn@iwarp.intel.com (Randal L. Schwartz) Newsgroups: comp.unix.shell,comp.lang.perl Subject: Re: search and replace string from a script Keywords: search replace script Message-ID: <1991Apr23.215804.8366@iwarp.intel.com> Date: 23 Apr 91 21:58:04 GMT References: <1991Apr23.180034.7349@progress.com> Sender: news@iwarp.intel.com Reply-To: merlyn@iwarp.intel.com (Randal L. Schwartz) Followup-To: comp.unix.shell Organization: Stonehenge; netaccess via Intel, Beaverton, Oregon, USA Lines: 36 In-Reply-To: root@progress.COM (Root of all Evil) 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... -- /=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\ | on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III | | merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn | \=Cute Quote: "Intel: putting the 'backward' in 'backward compatible'..."====/