Rocksolid Light

News from da outaworlds

mail  files  register  groups  login

Message-ID:  

BOFH excuse #102: Power company testing new voltage spike (creation) equipment


comp / comp.unix.questions / a sed question

SubjectAuthor
o a sed questionSalvador Mirzo

1
Subject: a sed question
From: Salvador Mirzo
Newsgroups: comp.unix.shell, comp.unix.questions
Followup: comp.unix.shell
Organization: A noiseless patient Spider
Date: Wed, 18 Dec 2024 19:46 UTC
Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: smirzo@example.com (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=
View all headers

(*) 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 "/<<Release>>=/ {
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...

<<Release>>=
something
@

.... sit a met [...]
% --8<-------------------------------------------------------->8---

Here's how I invoke it:

--8<-------------------------------------------------------->8---
%sh make-release release1 sample.txt
Lorem ipsum dolor...

<<Release>>=
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 "/<<Release>>=/ {
n;
c\\
$tag
q}" $*
--8<-------------------------------------------------------->8---

I still see the whole file:

--8<-------------------------------------------------------->8---
%sh make-release release1 sample.txt
Lorem ipsum dolor...

<<Release>>=
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.

1

rocksolid light 0.9.8
clearnet tor