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

Linux Bash:在文件中的特定位置插入一行,linux,bash,Linux,Bash,我正在编写一个脚本,需要在配置文件的特定部分添加行。比如说 之前: ServerActors=IpServer.UdpServerUplink MasterServerAddress=unreal.epicgames.com MasterServerPort=27900 ServerActors=IpServer.UdpServerUplink MasterServerAddress=master0.gamespy.com MasterServerPort=27900 ServerActors=

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

之前:

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。

您可以使用如下内容:

请注意,该命令必须在多行上输入,因为sed不允许像某些工具那样使用“\n”或Ctrl-V/Ctrl-M组合键对换行符进行编码。反斜杠表示“忽略我的返回键,我的命令尚未完成”

这样就可以了(它将插入第3行和第4行之间)

如果要将此命令本身放入shell脚本中,则必须避开反斜杠,这样它们就不会被bash吃掉,也不会传递给sed。在脚本中,命令变为:

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

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

$ 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

您可以在文件
filename
中的
sed
中,将其添加到特定字符串
模式
匹配后:

sed '/pattern/a some text here' filename
在你的例子中

sed '/master.mplayer.com/a \  new line' filename
(反斜杠遮罩新行中的第一个空格,因此可以在开始处添加更多空格)



资料来源:

有多种方法和语言可以做到这一点,可能
awk
sed
是最好的方法。你应该在这些行中指出逻辑,这样我们就可以帮助解决它。很难从一个复杂的案例中推断出规则。是否要在每次提到
WebServer
之前插入
ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.qtracker.com MasterServerPort=27900
?或者用相应的
qtracker
行跟踪每个
mplayer
行,或者什么?我想我找到了答案。不确定是否有更好的方法。但我只是简单地将sed替换为mplayer line,使用mplayer line换行符qtracker line
sed-I的/ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900/ServerActors=IpServer.UdpServerUplink MasterServerAddress=master.mplayer.com MasterServerPort=27900\n服务器actors=IpServer.UdpServerUplinkMasterServerAddress=master.qtracker.com MasterServerPort=27900/g'/tmp/test
虽然有点长,但似乎可以工作。或者简单地说,sed-i's/line3/line3\nline5/g'/tmp/test@dgibbs,这就是我通常的做法-在插入之前/之后替换字符串,保留原始内容并添加新内容。我明白了,您正在指定行号,这样,您可以精确地指向要添加行的位置。另一个类似于上面的sed选项是sed“3a\This is the new line”filewhat is.bak代表什么?
。bak
表示您要创建扩展名为“.bak”的备份.如果您愿意,您可以使用
.foo
,然后原始文件将以名称
文件名保存。foo
对不起,这里的
7
是什么?(
…“}7
)@setevoy它将应用默认动作awk:print。@Kent一定是个情人。但正如你所说,如果bond使用
awk
,他应该使用
007
,所以
+1
;)
!如果其他人感到困惑,本例中的
7
可以是任何计算为真的值。这样,awk就知道打印每一行。如果如果没有值,则只有匹配的行(本例中为#5)将生成输出(本例中为“新行文本”)。我想知道为什么这没有获得更多的投票,这是一种比明确知道搜索文本所在的行号更为动态的解决方案。meThis的+1是一个比公认的更好的答案,因为即使有其他东西与所讨论的文件交互,它也会可靠地保持。例如,我在Docker buil上使用了它如果有人在其他地方添加了一些配置,那么接受的答案会破坏构建。这不会。为什么管道将其返回到同一个文件不起作用?
awk…foo.input>foo.input
只是清空它file@AndyRay因为shell重定向发生在任何命令运行之前,这意味着文件立即被截断。另请参见。解决此问题的唯一方法是使用临时文件,例如
sed-i
透明。还有
moreutils
中的
scape
解决了此问题。它显示了预期的输出,但如何将该输出添加到文件中?文件保持不变
sed '/pattern/a some text here' filename
sed '/master.mplayer.com/a \  new line' filename