Sed, a powerfull mini-language from the 70s
19 points by random__duck 21 hours ago | 21 comments
  • supriyo-biswas 21 hours ago |
    This would have been a good article if the author actually took the time to write out the article themselves, perhaps in their native language, rather than using a LLM to write it.
    • adelks 21 hours ago |
      Indeed.
    • surgical_fire 21 hours ago |
      Man, I don't even hate LLM for the sake of it, but this LLM language and formatting is really grating after a while.
    • TheChaplain 20 hours ago |
      This one feels more authentic.

      https://www.grymoire.com/Unix/Sed.html

      • supriyo-biswas 19 hours ago |
        I actually prefer the "organization" of the original article, but could not continue past the LLMisms.
    • jlp__inf 14 hours ago |
      Hi, I'm the author of the article, and sorry if it felt overly LLM-generated.

      To clarify: I did spend quite a bit of time diving into `sed` myself (experiments, tests, etc.) and wrote an initial draft in French.

      I then used ChatGPT to help me structure and refine the article in English to reach more people. But the core ideas and understanding come from my own exploration.

      That said, I understand the concern, and for future articles I'll try to rely less on that kind of tooling for structure.

      Happy to clarify or go deeper on any part of the article if needed.

  • phplovesong 21 hours ago |
    For those of us using vim/neovim sed is something everyone had to learn, even if they did not realize it.

    This is the true power of vim. Even now decades later the unix toolbelt holds up, and is still unmatched for productivity.

    Vim is in the end just a small piece of the puzzle. You use small tools for your problem, mix and match.

    Its kind of like functional programming. Compose and reduce.

    • jlp__inf 14 hours ago |
      Yup, notably the famous %s/PATTERN1/PATTERN2/g, which I suppose comes from sed
  • aperrien 21 hours ago |
    Thanks for the blast from the past. SED led me to AWK, which led me to Perl, which lead me to Python. An interesting chain that brought me back to the interpreted languages like BASIC that I programmed in when I was a kid. Even though my formal training in college was Pascal and C.
    • jlp__inf 14 hours ago |
      Ha, I went the Python → AWK → sed route, just for the sake of learning what was behind those chamanics expressions. Glad I could bring back those memories!
  • 0xfaded 21 hours ago |
    I learned sed back in the day to show off. I wish I'd invested that effort in learning perl oneliners instead. For whatever reason I picked up enough awk along the way, and now that's what I tend to use if I ever need something beyond a simple substitution.
  • evanjrowley 21 hours ago |
    For a while my home had a Raspberry Pi 2B running FreeBSD 10 acting as a router-on-a-stick. When I lost SSH connectivity to it, I would instead use GNU screen as with a serial cable. For whatever reason, I could never get "full screen" TUI apps like vi and nano to display properly. To edit files (like pf.conf for firewall rules), I had to use sed to edit lines of the file. It was an interesting learning experience and perhaps a glimpse of how things used to be with green screen terminals. Shortly thereafter I switched over to a Beaglebone Green with OpenBSD 5 and never needed that workaround again.
    • jlp__inf 14 hours ago |
      Yep, interesting, do you remember the initial text structure and operatins you would perform on it ?
  • jasonpeacock 21 hours ago |
    Long ago, I bought the O'Reilly "Sed & Awk" book with plans to become a true unix guru.

    Then I realized I already knew Perl (and Perl one-liners), so there it sat unused on the shelf.

    • stvltvs 20 hours ago |
      Mostly it's useful in my experience on systems without Perl installed, but that doesn't often come up in my world.
  • piekvorst 20 hours ago |
    I prefer sam [1]. Unlike sed, it's not Turing complete, but it is far more elegant to my taste - consider this example from the article:

        :loop N; s/\n[[:space:]]\+/ /g; t loop; p
    
    In sam, the equivalent is:

        x/(.+\n)*/ x/\n */ c/ /
    
    It reads like this: loop over paragraphs of non-empty lines, loop over newline followed by spaces, replace with a single space. It's surprisingly close to SQL in its eloquence.

    Another example:

        N; h; s/\n/->/g ;p; g; D
    
    In sam, an equivalent would be

        {
            1,$-2 x/./ {
                a/->/
                /./ t .
            }
            $-1 d
        }
    
    Again, it's readable from top to bottom: from the first line to the second from the end, loop over each symbol, put "->" after it and copy the next symbol next to it; delete the last line.

    Let's see how far we can get. Another example:

        N; h; s/\n/->/g; p; G; D
    
    In sam, an equivalent would be:

        {
            d
            1,$-2 x/./ {
                1,/./ x/.|\n/ {
                    g/./ t $
                    g/\n/ $ c/->/
                }
                $ c/\n/
            }
        }
    
    It reads like this: delete the whole thing; from the first line to the second from the end, loop over each character; on each iteration, from the first line to the next character, run an inner loop over each character or newline; if it's a character, put it at the end; otherwise, put "->" at the end; once the inner loop is done, put a newline at the end.

    The final example from the post is too long to have it here (15 lines). Here's just the sam equivalent for it:

        x/(.+\n)+|\n+/ {
            g/./ x/\n/ c/ /
            v/./ c/\n/
        }
    
    It reads like this: loop over paragraphs of non-empty lines or sequences of newline characters; if it has any symbol (that is, it's a paragraph), replace each newline symbol with a space; if it doesn't have a symbol (that is, it's a sequence of newline symbols), replace it with a single newline.

    What I have learned from this is that a tool with limited but well-chosen primitives is more convenient than a universal state machine.

    (My examples may not be the exact same algorithms, since I do not understand (or need) sed concepts, but they do produce the same output.)

    [1]: https://9p.io/sys/doc/sam/sam.html

    • sanjayjc 15 hours ago |
      That looks interesting. I thought sam was an editor (which I've only read about, never used.) Good to see it can be used on the command line.

      Is there a port to Apple silicon?

    • jlp__inf 14 hours ago |
      Thanks for sharing this, I’m learning a lot from it.

      So if I understand correctly, it’s selection-based, right? You first select a region, and then you can apply further selections inside it?

      So you kind of build nested selections to match exactly what you want (almost like a conditional tree).

      And then you apply operations on the current selection

      For example substitution with something like c/PATTERN/, is that correct?

      • piekvorst 5 hours ago |
        That's exactly right. A few unmentioned details:

        . The dot (".") never matches newlines, which keeps line-oriented idioms from accidentally spanning newlines [1]

        . Changes must be sequential and non-overlapping (that's why I deleted the whole thing before processing in the third example).

        . Sam matches only the original input, not past changes.

        . Addresses (expressions before commands) select a single range, x commands select multiple ranges and loop over it.

        [1]: https://p9f.org/sys/doc/sam/sam.html, Regular expressions

  • kg08854 7 hours ago |