Groups | Search | Server Info | Login | Register


Groups > comp.unix.questions > #561

a sed question

From Salvador Mirzo <smirzo@example.com>
Newsgroups comp.unix.shell, comp.unix.questions
Subject a sed question
Followup-To comp.unix.shell
Date 2024-12-18 16:46 -0300
Organization A noiseless patient Spider
Message-ID <874j304vv3.fsf@example.com> (permalink)

Cross-posted to 2 groups.

Followups directed to: comp.unix.shell

Show all headers | View raw


(*) 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.

Back to comp.unix.questions | Previous | Next | Find similar


Thread

a sed question Salvador Mirzo <smirzo@example.com> - 2024-12-18 16:46 -0300

csiph-web