Inline substitution with NetBSD sed


I’m writing this on a plane to Japan for AsiaBSDCon again! I learned last year that NetBSD has a unique place there, and I’ve been keen to continue exploring it. My challenge for this year is to have NetBSD on par with FreeBSD on OrionVM, including full contextualisation. But I digress.

tl;dr Use NetBSD sed the same as GNU sed, not FreeBSD sed, for inline subtitution. You probably don’t want or need to know more, but consider the rest a bonus.

Comparing with GNU and FreeBSD sed

sed offers one of the most commonly encountered differences between the BSD and GNU toolchains. On Linux you can substitute a line in a file like this:

$ sed -i 's/Old/New/' $FILE

But this doesn’t behave the same on FreeBSD, and by extension, macOS:

==> sed: 1: "$FILE": invalid command code

The reason is FreeBSD sed requires an extension for -i, as per the manpage(1):

-i extension
    Edit files in-place, saving backups with the specified extension.

So what you really want to do is this. Note the empty string after -i:

$ sed -i '' 's/Old/New/' $FILE

NetBSD sed

Like a schmuck, I assumed the same applied on NetBSD. If you do enough web searches, you get frustrated quickly that people assume all the BSDs are functionally equivilent. But when I used the FreeBSD syntax above, I got:

==> sed: s/Old/New/: No such file or directory

Not to get all Malcolm Gladwell on you, but turns out NetBSD behaves like GNU in this case, and using -i is sufficient:

$ sed -i 's/Old/New/' $FILE

Author bio and support


Ruben Schade is a technical writer and infrastructure architect in Sydney, Australia who refers to himself in the third person. Hi!

The site is powered by Hugo, FreeBSD, and OpenZFS on OrionVM, everyone’s favourite bespoke cloud infrastructure provider.

If you found this post helpful or entertaining, you can shout me a coffee or send a comment. Thanks ☺️.