Sed 通过捕获组匹配替换正则表达式

Sed replace regular expression by capture group match

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

echo "master-abcdef" | sed -i '' -E "s/IMAGE_TAG:\s*(\S+)$//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)

你可以使用

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

这里,

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

$repl 替换将捕获的值 + repl 值放在匹配文本的位置。

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

sed -i.bak -E 's/(IMAGE_TAG:[[:blank:]]+)[^[:blank:]]+/master-abcdef/' file.yml

cat file.yml

global:
  env: default

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

此处 [[:blank:]] 匹配 space 或制表符。

如果您使用 gnu-sed 则使用:

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

,可以写

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