Regex 搜索段并在末尾附加值

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”的特定段之后附加一个字符串。 这是文件内容:

  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 } /COD> -在空白行插入一个新的行“我的字符串”
注意:在同一行上,
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'}文件