Path: csiph.com!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Salvador Mirzo Newsgroups: comp.unix.shell,comp.unix.questions Subject: a sed question Followup-To: comp.unix.shell Date: Wed, 18 Dec 2024 16:46:56 -0300 Organization: A noiseless patient Spider Lines: 103 Message-ID: <874j304vv3.fsf@example.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Wed, 18 Dec 2024 20:47:02 +0100 (CET) Injection-Info: dont-email.me; posting-host="94d9c60a35d521a9354fa25b9e1f9292"; logging-data="2562909"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1974td3IQE1T0o/PLzPiKP11JN/3kfgkTo=" Cancel-Lock: sha1:9sCtKsl+5yVm7/vWpuFs5CjLeHs= sha1:VLjNISIGTnBMI24X+Wptt6SK9V4= Xref: csiph.com comp.unix.shell:25973 comp.unix.questions:561 (*) Summary I wrote a sed script that makes a line replacement after it finds the right spot. So far so good. Then I added quit command after the change, but the quit does not seem to take effect---violating my expectation. I'll appreciate any help on understanding what's going on. (*) A detailed description I wrote this program: --8<-------------------------------------------------------->8--- %cat make-release #!/bin/sh usage() { printf '%s tag file\n' $0 exit 1 } test $# '<' 2 && usage tag="$1" shift sed "/<>=/ { n; c\\ $tag }" $* --8<-------------------------------------------------------->8--- Here's how I use it. My objective with it is to replace that /something/ in the text file with a new argument. --8<-------------------------------------------------------->8--- %cat sample.txt Lorem ipsum dolor... <>= something @ ... sit a met [...] % --8<-------------------------------------------------------->8--- Here's how I invoke it: --8<-------------------------------------------------------->8--- %sh make-release release1 sample.txt Lorem ipsum dolor... <>= release1 @ ... sit a met [...] --8<-------------------------------------------------------->8--- So far so good. I decided to try it on longer files and I wanted to see the change more quickly (without long files scrolling past my terminal), so I decided to add a /q/ command right after the c commmand. I thought---it will make sed quit right after making the change, so I can see it works as desired and then I remove the /q/ and release it to production. But that did not happen. --8<-------------------------------------------------------->8--- %cat make-release #!/bin/sh usage() { printf '%s tag file\n' $0 exit 1 } test $# '<' 2 && usage tag="$1" shift sed "/<>=/ { n; c\\ $tag q}" $* --8<-------------------------------------------------------->8--- I still see the whole file: --8<-------------------------------------------------------->8--- %sh make-release release1 sample.txt Lorem ipsum dolor... <>= release1 @ ... sit a met [...] % --8<-------------------------------------------------------->8--- I failed the exercise I gave myself. Can you help me to understand why the q command isn't stopping sed as I thought it would? I'd like to get a better intuition. I've been reading Dale Dougherty and Arnold Robin's ``sed & awk'' book. If you have any recommended sed-related bibliography, I'd appreciate it, too.