我正在编写一个脚本,要求我在配置文件的特定部分添加行。例如
在:
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。
答案 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
(反斜杠掩盖了新行中的第一个空格,因此您可以在开头添加更多空格)