忽略搜索模式开头的空格

忽略搜索模式开头的空格

这个 sed 表达式可以工作,但是有没有更好的方法来表示搜索模式和替换字符串中的空格?

BRANCHTAG=7.17.9-main-5ee3e99d5ff002862d93728d821461033de1186d
PRIOR_VERSION=7.17.4
clear; sed "s/^    newTag: ${PRIOR_VERSION}.*$/    newTag: ${BRANCHTAG}/" kustomization.yaml

我不能只搜索 newTag,因为这会替换文件中的所有 newTag 字符串

答案1

假设您希望在行首允许任意数量的空格(空格或制表符)并且您希望保留这些空格:

sed "s/^\([[:blank:]]*newTag:\) $PRIOR_VERSION.*/\1 $BRANCHTAG/" kustomization.yaml

这使用反向引用将匹配的空格和键本身插入表达式的替换部分sed。然后将新值插入其中。

假定 in 中的值$BRANCHTAG不包含字符&、文字换行符、斜杠或反斜杠字符(这些字符需要单独转义)。

假设 in 中的值$PRIOR_VERSION是不包含斜杠的正则表达式。由于它被解释为正则表达式,因此需要对点(例如)进行转义。

也可以看看如何确保插入到“sed”替换中的字符串转义所有元字符

但由于您正在处理 YAML 文件,因此使用适当的 YAML 解析器会更安全,例如yq(来自https://kislyuk.github.io/yq/):

yq -y --arg oldval "$PRIOR_VALUE" --arg newval "$BRANCHTAG" \
    'if .newTag == $oldval then .newTag |= $newval else . end' kustomization.yaml

这假设newTag是 YAML 文档中的顶级键,并且如果当前值为 ,则将$newval使用在命令行上传递给参数的值替换该键的值。该值还将由解析器正确引用和编码(假设它是常见的 UTF-8 字符串)。包含换行符、反斜杠或其他可能存在问题的字符的值没有问题。--arg$oldvalyqsed

yq--in-place可以使用其(或-i) 选项进行就地编辑。

相关内容