Learn Docker With My Newest Course

Dive into Docker takes you from "What is Docker?" to confidently applying Docker to your own projects. It's packed with best practices and examples. Start Learning Docker →

Insert Text Above / Below a Match with sed

insert-text-above-below-a-match-with-sed.jpg

You can use sed to replace or delete strings but it can also insert text at specific points, here's how.

Quick Jump:

Here’s a couple of examples.

Inserting a line before a match:

Take note of the /i (insert) within the sed command:

$ echo "hello world" | sed "/^hello/i inserted before"
inserted before
hello world
Appending a line after a match:

Take note of the /a (append) within the sed command:

$ echo "hello world" | sed "/^hello/a appended after"
hello world
appended after
Prepending or appending extra new lines with \n:

This is using the GNU version of sed, it does operate differently if you’re using the OpenBSD (macOS) version of sed due to how it supports \n.

If you want to do it in a way that works with both, it can be done but let’s focus on the common case with the GNU version first.

$ echo "hello world" | sed "/^hello/i inserted before with extra line breaks\n\n"
inserted before with extra line breaks


hello world
$ echo "hello world" | sed "/^hello/a \\\n\nappended after with extra line breaks"
hello world


appended after with extra line breaks

For the 2nd example we double escape the first line break. Without that I found that sed returns literally n with only 1 of the line breaks. Also, using \ \n\n worked. I’m not exactly sure why we have to do either one but it is a working solution.

As for making either example work with both the GNU and OpenBSD versions of sed you can replace \n with a literal new line, such as this:

# Using single quotes instead of double is important here, so is using \ to
# break the script into multiple lines.
echo "hello world" | sed '/^hello/i inserted before with extra line breaks\
\
'

# Demo Video

Timestamps

  • 0:12 – Inserting text before a match
  • 0:49 – Appending text after a match
  • 1:12 – Beware of adding extra line breaks
  • 3:25 – Handling extra new lines in a cross OS compatible way

When was the last time you did this with sed? Let me know below.

Never Miss a Tip, Trick or Tutorial

Like you, I'm super protective of my inbox, so don't worry about getting spammed. You can expect a few emails per year (at most), and you can 1-click unsubscribe at any time. See what else you'll get too.



Comments