Insert a line before or after a pattern

In this article, we will see the different ways in which we can insert a line before or after on finding a pattern. On finding the pattern 'Fedora', the requirement is to insert a line:

Let us consider a file with the following contents:
$ cat file
Linux
Solaris
Fedora
Ubuntu
AIX
HPUX

Inserting before the pattern:

1. awk solution.

$ awk '/Fedora/{print "Cygwin"}1' file
Linux
Solaris
Cygwin
Fedora
Ubuntu
AIX
HPUX

The '1' at the end prints every line by default. On finding the pattern 'Fedora', 'Cygwin' is printed. Hence, first "Cygwin" gets printed followed by 'Fedora'(1).

2. sed solution which is simple.

$ sed 's/.*Fedora.*/Cygwin\n&/' file
Linux
Solaris
Cygwin
Fedora
Ubuntu
AIX
HPUX

On finding the pattern 'Fedora', substitute with 'Cygwin' followed by the pattern matched.

3. Perl solution:

$ perl -plne 'print "Cygwin" if(/Fedora/);' file
Linux
Solaris
Cygwin
Fedora
Ubuntu
AIX
HPUX

The 'p' option is the alternative for the '1' in awk, prints every line by default. Rest is self-explanatory.

4. Pure bash shell script solution:

#!/usr/bin/bash

while read line
do
echo $line | grep -q "Fedora"
[ $? -eq 0 ] && echo "Cygwin"
echo $line
done < file

A line is read. grep -q is silent grep where the result, if any, will not be displayed. The status($?) will be 0 if a match is found and hence 'Cygwin' is printed.

Inserting after the Pattern:

5. awk solution

$ awk '/Fedora/{print;print "Cygwin";next}1' file
Linux
Solaris
Fedora
Cygwin
Ubuntu
AIX
HPUX

The difference here is the addition of two extra commands: print and next. print will print the current line, and the next command will skip the current line from printing again.

6. sed solution:

$ sed 's/.*Fedora.*/&\nCygwin/' file
Linux
Solaris
Fedora
Cygwin
Ubuntu
AIX
HPUX

Simple change from the earlier sed solution. Patten matched(&) followed by "Cygwin".

7. perl solution.

$ perl -lne 'print $_;print "Cygwin" if(/Fedora/);' file
Linux
Solaris
Fedora
Cygwin
Ubuntu
AIX
HPUX

The default printing command 'p' is removed and simply every line is printed using special variable $_.

8. Bash shell script for inserting after the pattern:

#!/usr/bin/bash

while read line
do
echo $line
echo $line | grep -q "Fedora"
[ $? -eq 0 ] && echo "Cygwin"
done < file