regex - 使用 SED 替换缩进的文本

标签 regex awk sed yaml

我正在考虑使用 sed 替换 Yaml 文件中的一些缩进行。

      resources:
        limits:
          cpu: 500m
          memory: 512Mi
        requests:
          cpu: 250m
          memory: 256Mi

Yaml 对其缩进非常严格,并且想知道如何在示例“limits:”之后完成文本的替换

我试过 '0,/cpu:.*m/s//cpu: 900m/''/limits:/!b;n;s//ccpu: 900 米'

'0,/cpu:.*m/s//cpu: 900m/' 输出:

          resources:
        limits:
          cpu: 900m
          memory: 512Mi
        requests:
          cpu: 250m
          memory: 256Mi

我遇到的唯一问题是我想指定替换应该在示例 CPU 上完成,而不是请求。

所以我尝试了 '/limits:/!b;n;s//ccpu: 900m' 输出:

          resources:
        limits:
cpu: 900m
          memory: 512Mi
        requests:
          cpu: 250m
          memory: 256Mi

注意到它没有正确缩进吗?我怎样才能通过保留缩进来实现这一点,如果我可以在“限制:”或“请求:”之后指定第一行和第二行,那就太好了。

最佳答案

如果无法安装yaml parsing tools such as yq ,您可以使用此 gnu-sed 解决方案:

sed -E '/limits:/!b;n;s/^([[:blank:]]*cpu: ).*/\1900m/' file.yml

      resources:
        limits:
          cpu: 900m
          memory: 512Mi
        requests:
          cpu: 250m
          memory: 256Mi

分割:

  • /limits:/!b: 搜索文本 limits: 否则分支到脚本结尾
  • n:读取/追加下一行输入到模式空间
  • s/.../.../:做这个替换
    • ^:比赛开始
    • ([[:blank:]]*cpu: ):匹配 0 个或多个空格后跟文本 cpu: 。在捕获组 #1 中捕获它
    • .*:匹配剩余的文本直到行尾
    • /\1900m/:替换为捕获组 #1 的反向引用,即 \1 后跟新值 900m

关于regex - 使用 SED 替换缩进的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74029140/

相关文章:

regex - 如何使用 awk 正则表达式按查询字符串值排序?

Javascript RegEx 匹配 URL 但排除图像

bash - 在 sed 命令中转义正斜杠

c# - 将 "Max Length"添加到正则表达式

regex - Bash 中不区分大小写的条件

bash - 从文件中的特定行以相反的顺序 Grep 文件

python - 重新格式化文本数据从整数转换为时间并使用 sed awk split 与日期连接

regex - 为什么使用字符串替换来形成正则表达式不起作用?

linux - 使用 sed,我想替换文件中的字符串值

regex - 使用 Bash (sed?) 删除包含特定文本的多行/* ... */样式注释(正则表达式)