Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在文件中查找块并使用awk/sed命令在特定位置插入字符串_Shell - Fatal编程技术网

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
    设置为一,打印要输出的行,然后跳到下一行开始

  • n==1&/\[/{n=0;打印“CONNECTION=MQ\n”}

    此语句在MAIN之后的第一个块的开头执行。它在下一个块的开头之前打印行
    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