Regex 搜索段并在末尾附加值
在一个文件中,我想在具有键“sys mgmt agent”的特定段之后附加一个字符串。 这是文件内容:Regex 搜索段并在末尾附加值,regex,linux,bash,sed,Regex,Linux,Bash,Sed,在一个文件中,我想在具有键“sys mgmt agent”的特定段之后附加一个字符串。 这是文件内容: sys-mgmt-agent: networks: edgex-network: aliases: - edgex-sys-mgmt-agent depends_on: - redis volumes: - /proc/uptime:/proc/uptime - /var/log/au
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
这是预期的结果:
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
MY STRING
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
我使用sed命令找到了该段:sed-n'/sys-mgmt-agent:/,/^\s*$/p'
,但无法追加字符串。假设:
- OP坚持使用可在
bash
- 输入的格式很好,如图所示
- 如果
多次显示,则需要将所需字符串附加到每个段sys-mgmt-agent:
- 段之间至少有一条空行
awk
解决方案:
$ mystring="MY STRING" # string to be appended to segment
$ awk -v ms="${mystring}" ' # pass ${mystring} as awk variable "ms"
/sys-mgmt-agent:/ { foundit=1 } # if line contains "sys-mgmt-agent:" then set our flag
/^$/ && foundit { printf " %s\n\n", ms # if blank line and foundit=1 then print our string plus a new blank line
foundit=0 # reset our flag
next # go to next input line
}
{ print } # print all other lines as is
' mydata # assuming input data is in file named "mydata"
上述情况产生:
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
MY STRING
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
MY STRING
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
基于OPs
sed
尝试的sed
想法:
$ mystring='MY STRING'
$ sed "/sys-mgmt-agent:/,/^$/{/^$/i\ ${mystring}
}" mydata
其中:
-要搜索的范围/sys mgmt agent/,/^$/
-应用于匹配范围的命令{…}
i\${mystring}
后面不能有任何内容,因此是两行解决方案;我愿意接受关于如何将其压缩成一行的建议
更新:@poton建议使用
-e
标志拼凑一行解决方案,并在${mystring}
周围添加双引号:
$ mystring='MY STRING'
$ sed -e '/sys-mgmt-agent:/,/^$/{/^$/i\ '"${mystring}" -e '}' mydata
上述情况产生:
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
MY STRING
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
sys-mgmt-agent:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
MY STRING
edge-orchestrator:
networks:
edgex-network:
aliases:
- edgex-sys-mgmt-agent
depends_on:
- redis
volumes:
- /proc/uptime:/proc/uptime
- /var/log/auth.log:/var/log/auth.log
- ${HOST_SECURITY_FILE_PATH}edgex-redis:/tmp/edgex/secrets/edgex-redis:z
这可能适用于您(GNU-sed):
注意:如果
我的字符串
包含/
,则必须对其进行转义/引用,即\/
。这也会缩进到最后一节的深度。IMHO专家总是建议使用类似于yq
的工具,以便更好地理解yaml文件。您的系统中是否有yq
,或者您可以安装它?根据您的回答,这里的人可以为您提供指导。不,我无法在远程服务器中安装软件。谢谢,请告诉我是否有办法在单行中使用该命令。@sarjaana您可以尝试:sed-e'/sys mgmt agent:/,/^$/{^$/I\${mystring}-e'}文件