Sujet : Re: a sed question
De : janis_papanagnou+ng (at) *nospam* hotmail.com (Janis Papanagnou)
Groupes : comp.unix.shellDate : 20. Dec 2024, 15:55:12
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vk40gi$3g9sm$1@dont-email.me>
References : 1
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0
On 18.12.2024 20:46, Salvador Mirzo wrote:
(*) 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.
First (before I forget it) change your string comparison '<' to the
numerical comparison operator '-lt' as in: test $# -lt 2 && usage
Otherwise, if you get used to using the wrong operator, you may get
subtle errors in future if you continue that habit.
Also note that using $* may not work correctly (e.g. depending on
filenames [containing spaces] used). The safe form is a quoted "$@"
(Then I was tempted to make a similar comment as Kenny. But...)
WRT your question I'd be interested to understand more about the
intention of your original question...
I mean if you don't trust your 'sed' command just pipe it though
'less'; there's no need to change the 'sed' program just for that.
Personally I'd try whether it works (by adding "something" before
and also after the desired place in your sample.txt to be sure the
other occurrences were not changed), and then just call
sed -e '/<<Release>>=/,+1s/something/sth else/' sample.txt
to see it working.
Janis
(*) 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.