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,可以写
yq eval '.default.IMAGE_TAG = "master-abcdef"' values.yaml
我正在尝试使用 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,可以写
yq eval '.default.IMAGE_TAG = "master-abcdef"' values.yaml