How do I add a line of text to the middle of a file using bash?

Solution 1:

Here is a solution using sed:

$ sed -n 'H;${x;s/^\n//;s/nameserver .*$/nameserver 127.0.0.1\n&/;p;}' resolv.conf

# Generated by NetworkManager
domain dhcp.example.com
search dhcp.example.com
nameserver 127.0.0.1
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3

How it works: first, suppress the output of sed with the -n flag. Then, for each line, we append the line to the hold space, separating them with newlines:

H

When we come to the end of the file (addressed by $) we move the content of the hold space to the pattern space:

x

If the first line in pattern space is blank we replace it with nothing.

s/^\n//

Then we replace the first line starting with nameserver by a line containing nameserver 127.0.0.1, a new line (Your version of sed may not support \n, in which case replace the n with a literal newline) and the original line (represented by &):

s/nameserver .*$/nameserver 127.0.0.1\n&/

Now we just need to print the results:

p

Solution 2:

Assuming you want to insert immediately after the search line, this is much simpler:

sed -ie '/^search/a nameserver 127.0.0.1' filename
  • -i : edit file in place
  • -e : allows the execution of a script/commands inside sed expression
  • a mynewtext : command that tells sed to insert the text mynewtext after matched pattern

Solution 3:

awk '/^nameserver/ && !modif { printf("INSERT\n"); modif=1 } {print}'

Solution 4:

How about something like:

sed -e ':a;N;$!ba;s/nameserver/nameserver 127.0.0.1\nnameserver/' /etc/resolv.conf

(similar to this: sed: Find pattern over two lines, not replace after that pattern)