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 linesed-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