【问题标题】:Sed replace regular expression by capture group matchsed 通过捕获组匹配替换正则表达式
【发布时间】:2021-11-14 10:06:09
【问题描述】:

我正在尝试使用sed 替换正则表达式捕获组。我读过这需要使用-E 标志启用扩展正则表达式。但是,以下命令仍然没有按预期更新文本。

echo "master-abcdef" | sed -i '' -E "s/IMAGE_TAG:\s*(\S+)$/\1/g" values.yaml

values.yaml 的内容为:

global:
  env: default

default:
  IMAGE_TAG: dev-0be3323.zgm9a
  ... (more text below)

我期待 values.yaml 被替换为:

global:
  env: default

default:
  IMAGE_TAG: master-abcdef
  ... (more text below)

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    您可以在任何版本中使用它sed:

    sed -i.bak -E 's/(IMAGE_TAG:[[:blank:]]+)[^[:blank:]]+/\1master-abcdef/' file.yml
    
    cat file.yml
    
    global:
      env: default
    
    default:
      IMAGE_TAG: master-abcdef
      ... (more text below)
    

    这里[[:blank:]] 匹配空格或制表符。

    如果您使用的是gnu-sed,请使用:

    sed -i -E 's/(IMAGE_TAG:\s+)\S+/\1master-abcdef/' file.yml
    

    【讨论】:

      【解决方案2】:

      ,你可以写

      yq eval '.default.IMAGE_TAG = "master-abcdef"' values.yaml
      

      【讨论】:

        【解决方案3】:

        你可以使用

        repl="master-abcdef"
        sed -i '' -E "s/(IMAGE_TAG:[[:space:]]*).*/\\1$repl/" values.yaml
        

        这里,

        • (IMAGE_TAG:[[:space:]]*) - 捕获到 \1 一个 IMAGE_TAG: 字符串,然后是任何零个或多个空格
        • .* - 匹配字符串的其余部分(此处为行)。

        \1$repl 替换将捕获的值 + repl 值替换匹配的文本。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-14
          • 2016-02-10
          • 2015-08-06
          • 1970-01-01
          • 2021-05-28
          • 1970-01-01
          • 2019-10-16
          • 2021-04-08
          相关资源
          最近更新 更多