• a sed question

    From Salvador Mirzo@21:1/5 to All on Wed Dec 18 16:46:56 2024
    XPost: comp.unix.shell

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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)