![忽略搜索模式开头的空格](https://linux22.com/image/204801/%E5%BF%BD%E7%95%A5%E6%90%9C%E7%B4%A2%E6%A8%A1%E5%BC%8F%E5%BC%80%E5%A4%B4%E7%9A%84%E7%A9%BA%E6%A0%BC.png)
这个 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
$oldval
yq
sed
yq
--in-place
可以使用其(或-i
) 选项进行就地编辑。