Sed

忽略搜尋模式開頭的空格

  • April 18, 2022

這個 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)選項進行就地編輯。

引用自:https://unix.stackexchange.com/questions/699442