Bash: Inserting a line in a file at a specific location

LinuxBash

Linux Problem Overview


I am writing a script that will require me to add lines in a specific part of a config file. For example

Before:

ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
ServerActors=UWeb.WebServer

After:

ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900
ServerActors=UWeb.WebServer

As you can see there is a new line added. How can my bash script insert the line? I'm guessing I will need to use sed.

Linux Solutions


Solution 1 - Linux

If you want to add a line after a specific string match:

$ awk '/master.mplayer.com/ { print; print "new line"; next }1' foo.input
ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900
new line
ServerActors=UWeb.WebServer

Solution 2 - Linux

You can use something like this:

Note that the command must be entered over multiple lines because sed does not allow coding a newline with "\n" or the Ctrl-V/Ctrl-M key combination like some tools. The backslash says "Ignore my hitting the return key, I'm not done with my command yet".

sed -i.bak '4i\
This is the new line\
' filename

This should do the trick (It will insert it between line 3 and 4).

If you want to put this command itself into a shell script, you have to escape the backslashes so they don't get eaten by bash and fail to get passed to sed. Inside a script, the command becomes:

sed -i.bak '4i\\
This is the new line\\
' filename

Solution 3 - Linux

awk 'NR==5{print "new line text"}7' file

Solution 4 - Linux

You can add it with sed in your file filename after a certain string pattern match with:

sed '/pattern/a some text here' filename

in your example

sed '/master.mplayer.com/a \  new line' filename

(The backslash masks the first space in the new line, so you can add more spaces at the start)

source: https://unix.stackexchange.com/a/121166/20661

Solution 5 - Linux

if you are using sed you need to use -i option to save content in original file otherwise it will only print output in terminal

sed -i '/pattern/a \some text here' filename

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondgibbsView Question on Stackoverflow
Solution 1 - LinuxAdrian FrühwirthView Answer on Stackoverflow
Solution 2 - LinuxMPrazzView Answer on Stackoverflow
Solution 3 - LinuxKentView Answer on Stackoverflow
Solution 4 - Linuxrubo77View Answer on Stackoverflow
Solution 5 - LinuxVaibhav VatsView Answer on Stackoverflow