Bash:在特定位置的文件中插入一行

时间:2013-08-16 11:32:09

标签: linux bash

我正在编写一个脚本,要求我在配置文件的特定部分添加行。例如

在:

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

后:

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

正如您所看到的,添加了一个新行。我的bash脚本如何插入该行?我猜我需要使用sed。

4 个答案:

答案 0 :(得分:78)

如果要在特定字符串匹配后添加一行:

$ 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

答案 1 :(得分:27)

您可以使用以下内容:

请注意,必须在多行上输入命令,因为sed不允许使用“\ n”编辑换行符或使用Ctrl-V / Ctrl-M组合键来编写某些工具。反斜杠说:“忽略我击中返回键,我还没有完成我的命令。”

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

这应该可以解决问题(它将在第3行和第4行之间插入)。

如果你想把这个命令本身放到一个shell脚本中,你必须转义反斜杠,这样它们就不会被bash吃掉并且无法传递给sed。在脚本中,命令变为:

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

答案 2 :(得分:13)

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

答案 3 :(得分:2)

在某个字符串sed与之匹配后,您可以在文件filename中使用pattern添加:

sed '/pattern/a some text here' filename

在你的例子中

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

(反斜杠掩盖了新行中的第一个空格,因此您可以在开头添加更多空格)

来源:https://unix.stackexchange.com/a/121166/20661