49

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

前:

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

5 回答 5

104

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

$ 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
于 2013-08-16T15:07:34.183 回答
31

你可以使用这样的东西:

请注意,该命令必须分多行输入,因为 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
于 2013-08-16T11:55:53.287 回答
18
awk 'NR==5{print "new line text"}7' file
于 2013-08-16T12:32:31.990 回答
4

您可以在与某个字符串匹配后将其添加sed到文件中:filenamepattern

sed '/pattern/a some text here' filename

在你的例子中

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

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

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

于 2016-11-15T14:42:23.093 回答
0

如果您使用 sed,则需要使用 -i 选项将内容保存在原始文件中,否则它只会在终端中打印输出

sed -i '/pattern/a \some text here' filename
于 2022-03-04T06:50:36.597 回答