我正在嘗試從用于 helm 值的 yaml 檔案中搜索和替換字串。我使用以下命令提取兩個檔案之間不同的值:
diff a.yaml b.yaml|grep ">"|cut -c 3- > new_file.yaml
a.yaml 檔案包含以下幾行:
NAME_VAR: {{ .Data.data.name_var }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}
和 b.yaml 這個:
NAME_VAR: {{ .Data.data.name_var }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}
ADD_THIS: {{ .Data.data.<change_me> }}
new_file.yaml 中的輸出為我提供了以下內容:
ADD_THIS: {{ .Data.data.<change_me> }}
我需要用輸出“ADD_THIS”的鍵替換 <change_me> 中的字串,它應該如下所示:
ADD_THIS: {{ .Data.data.add_this }}
這些更改稍后將在 argocd 中自動更新到 vault。
我考慮過使用 awk 但我似乎無法替換它......
編輯
如果您想替換多個欄位,例如
一個.yaml檔案
NAME_VAR: {{ .Data.data.name_var }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}
b.yaml檔案
NAME_VAR: {{ .Data.data.name_var }}
SOME_VALUE: {{ .Data.data. }}
ONE_MORE: {{ .Data.data. }}
ADD_THIS: {{ .Data.data. }}
使用詹姆斯的回答,這是輸出:
ADD_THIS: {{ .Data.data.add_this }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}
SOME_VALUE: {{ .Data.data.some_value }}
ONE_MORE: {{ .Data.data.one_more }}
uj5u.com熱心網友回復:
一個 awk 使您不再使用diffandgrep和cut:
$ awk 'NR==FNR{ # process first file, which ever
a[$0] # hash records to a
next # on to the next record
}
{ # process second file
if($0 in a) # if record is in hash (or file 1)
delete a[$0] # remove it from the hash as it is not wanted
else # if record is not in hash (or file 1)
a[$0] # store it to the hash as it is wanted
}
END { # in the end all wanted records are left in the hash
for(i in a) { # go thru all of them
$0=i
sub(/<change_me>/,substr(tolower($1),1,length($1)-1))
print # make the change (above) and output
}
}' [ab].yaml
輸出:
ADD_THIS: {{ .Data.data.add_this }}
您可以將sub上面的替換為
sub(/[^.]*$/,substr(tolower($1),1,length($1)-1),$3)
如果<change_me>實際上是任意字串。
編輯以解決評論中提到的問題:
現在它存盤并比較第一個欄位并比較它們,即:
a[SOME_VALUE:]="SOME_VALUE: {{ .Data.data.some_value }}"
現在計劃:
$ awk 'NR==FNR {
a[$1]=$0
next
}
{
if($1 in a)
delete a[$1]
else
a[$1]=$0
}
END {
for(i in a) {
$0=a[i]
sub(/[^.]*$/,substr(tolower($1),1,length($1)-1),$3)
print
}
}' [ab].yaml
uj5u.com熱心網友回復:
更好用sed對于這個特定任務:
$ sed 's/<change_me>/add_this/' file
ADD_THIS: {{ .Data.data.add_this }}
uj5u.com熱心網友回復:
這采用第一列的值,降低它,還洗掉冒號,然后進行替換。
$ awk '{str = tolower($1)
sub(":", "", str)
sub("<change_me>", str, $0)}1' new_file.yaml
ADD_THIS: {{ .Data.data.add_this }}
uj5u.com熱心網友回復:
如果第一列輸出可以是其他鍵值和/或占位符可以不同于“change me”,awk 可以使用變數名來參考它們。
該演示使用 echo 將輸出提供給 awk,但相同的 awk 程序將處理一個多行檔案,其中有許多行要被替換,并且不依賴于鍵值或占位符文本。
echo "ADD_THIS: {{ .Data.data.<change_me> }}" | awk ' {n=split($3,parts,"."); sub(parts[n],tolower($1), $3); print $0} ';
結果:
ADD_THIS: {{ .Data.data.add_this: }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536829.html
