Sed
忽略搜尋模式開頭的空格
這個 sed 表達式有效,但是有沒有更好的方法來表示搜尋模式和替換字元串中的空白?
BRANCHTAG=7.17.9-main-5ee3e99d5ff002862d93728d821461033de1186d PRIOR_VERSION=7.17.4 clear; sed "s/^ newTag: ${PRIOR_VERSION}.*$/ newTag: ${BRANCHTAG}/" kustomization.yaml
我不能只搜尋 newTag,因為它會替換文件中的所有 newTag 字元串
假設您希望在行首允許任意數量的空格(空格或製表符)並且您希望保留這些:
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
在命令行中傳遞的值作為參數,--arg
如果它的目前值是$oldval
. 該值還將被yq
解析器正確引用和編碼(假設它是一個常見的 UTF-8 字元串)。包含換行符、反斜杠或其他可能對sed
.
yq``--in-place
可以使用其(或-i
)選項進行就地編輯。