Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connectionsPath: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Ed Morton
Newsgroups: comp.unix.shell
Subject: Re: a sed question
Date: Sat, 21 Dec 2024 08:13:52 -0600
Organization: A noiseless patient Spider
Lines: 87
Message-ID:
References: <874j304vv3.fsf@example.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Sat, 21 Dec 2024 15:13:52 +0100 (CET)
Injection-Info: dont-email.me; posting-host="bb9846ad42d0809f727f455bcc1abbec";
logging-data="89276"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+5eriiE4Ca94jG/C66HgGb"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:Qpa9YZl4wrOXYVSroO4f3mK8E6c=
Content-Language: en-US
X-Antivirus-Status: Clean
X-Antivirus: Avast (VPS 241221-2, 12/21/2024), Outbound message
In-Reply-To: <874j304vv3.fsf@example.com>
Bytes: 3528
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 "/<>=/ {
> 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---
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 `<>=`
then using any POSIX awk you could do:
tag="$tag" awk '
!f { print }
{ f = 0 }
$0 == "<>=" {
print ENVIRON["tag"]
f = 1
}
' "${@:--}"
or if it can be multiple lines ending with `@`:
tag="$tag" awk '
$0 == "@" { f = 0 }
!f { print }
$0 == "<>=" {
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.