Sujet : Re: a sed question
De : mortonspam (at) *nospam* gmail.com (Ed Morton)
Groupes : comp.unix.shellDate : 21. Dec 2024, 15:13:52
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vk6if0$2n5s$1@dont-email.me>
References : 1
User-Agent : Mozilla Thunderbird
On 12/18/2024 1:46 PM, 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.
(*) 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---
<snip>
I'm not going to get into what might be wrong in your sed script because, while sed is great for doing s/old/new/ on individual lines, for anything else you should just use awk for some combination of robustness, clarity, portability, maintainability, and all of the other desirable attributes of good software.
For example, if there's always just 1 line of text under `<<Release>>=` then using any POSIX awk you could do:
tag="$tag" awk '
!f { print }
{ f = 0 }
$0 == "<<Release>>=" {
print ENVIRON["tag"]
f = 1
}
' "${@:--}"
or if it can be multiple lines ending with `@`:
tag="$tag" awk '
$0 == "@" { f = 0 }
!f { print }
$0 == "<<Release>>=" {
print ENVIRON["tag"]
f = 1
}
' "${@:--}"
If you want to temporarily exit after printing the replaced value just add `exit` after `f = 1`.
Note that `tag="$tag" awk` have to be on a single line exactly as shown. See
https://stackoverflow.com/questions/19075671/how-do-i-use-shell-variables-in-an-awk-script for more info on using shell variables values in an awk script and
https://stackoverflow.com/questions/29613304/is-it-possible-to-escape-regex-metacharacters-reliably-with-sed for more info on using shell variables values in a sed script.
Ed.