この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
。次に、新しい値を挿入します。
$BRANCHTAG
in の値には、文字、リテラル改行文字、スラッシュ、またはバックスラッシュ文字が含まれていないと仮定します&
(これらの文字は別々にエスケープする必要があります)。
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
内部編集には対応する(または)オプションを使用できます。