Shell 如何在文件中查找块并使用awk/sed命令在特定位置插入字符串
我的要求是读取一个文件并在块[]中找到一个字符串,然后插入一个新字符串,后跟上面搜索的字符串 例如,输入文件中的数据如下所示Shell 如何在文件中查找块并使用awk/sed命令在特定位置插入字符串,shell,Shell,我的要求是读取一个文件并在块[]中找到一个字符串,然后插入一个新字符串,后跟上面搜索的字符串 例如,输入文件中的数据如下所示 #starting of the file [MAIN] . . . connection = TCPIP connection = HTTP connection = HTTPS . . . [TCPIP] name = tcpip1 port = 2222 . . .
#starting of the file
[MAIN]
.
.
.
connection = TCPIP
connection = HTTP
connection = HTTPS
.
.
.
[TCPIP]
name = tcpip1
port = 2222
.
.
.
[HTTP]
name = http1
port = 3333
.
.
.
[HTTPS]
name = https1
port = 4444
.
.
.
#end of the file
我的要求是1) 在连接最后一次出现后,我需要在[MAIN]块中插入一个新连接(MQ)
2) 我需要在文件末尾插入一个带有[MQ]的块,并插入所有必需的详细信息 预期产出应为
#starting of the file
[MAIN]
.
.
.
connection = TCPIP
connection = HTTP
connection = HTTPS
connection = MQ
.
.
.
[TCPIP]
name = tcpip1
port = 2222
.
.
.
[HTTP]
name = http1
port = 3333
.
.
.
[HTTPS]
name = https1
port = 4444
.
.
.
[MQ]
name = mq1
port = 5555
.
.
.
#end of the file
我尝试使用awk和sed命令查找字符串的出现处并插入新字符串。但是,我没有找到如何获取字符串[连接]的最后一个匹配项。你能告诉我如何才能做到这一点吗?谢谢。有几种方法可以解决这个问题。以下是一种方法(带有示例输出): 让我们依次查看每个
awk
语句:
这将检查主块的开始。如果开始,它将标志/\[MAIN\]/{n=1;打印;下一步}
设置为一,打印要输出的行,然后跳到下一行开始n
此语句在MAIN之后的第一个块的开头执行。它在下一个块的开头之前打印行n==1&/\[/{n=0;打印“CONNECTION=MQ\n”}
。它还将标志CONNECTION=MQ
重置为零,以便我们知道我们已经离开了主块n
这只是将输入行回显到标准输出{print}
在文件末尾,这将打印出所需的新块END{print”[MQ]\nname=mq1}
awk
不直接支持就地修改源文件。但是,同样的效果很容易实现:
mv -f input input.bak && awk '/^\[MAIN\]/ {n=1;print;next} n==1 && /^\[/ {n=0;print "CONNECTION=MQ\n"} {print} END {print "[MQ]\nname=mq1"}' input.bak >input
上述操作将创建原始文件的备份副本,然后用修改后的版本覆盖原始文件。如何将这些更改应用于输入文件,而不是将其应用于标准输出。我该如何做?@user3790141查看更新答案的最后一节。
mv -f input input.bak && awk '/^\[MAIN\]/ {n=1;print;next} n==1 && /^\[/ {n=0;print "CONNECTION=MQ\n"} {print} END {print "[MQ]\nname=mq1"}' input.bak >input