yamlフィールドをファイルの内容に置き換える

yamlフィールドをファイルの内容に置き換える

最近、これと非常によく似た質問がありましたが、その特定のケースの解決策について十分なフィードバックを提供できませんでした。より多くの情報と背景を含む質問を開きます。

2つのファイルがあります。

ファイル1:

not_keyword: 'something'
keyword: 'condition'
another_not_keyword: 'something'

ファイル2:

condition 1 condition 2 condition 3

次のすべての項目を見つけたいですkeywordファイル1そしてその内容を交換してください(健康状態)内容があるファイル2

この場合、希望の出力は次のようになります。

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something"

私の意図は、適​​切な場所(ファイル自体から直接)で交換が行われるようにすることです。 gawkを使用したソリューションが提供されましたが、残念ながら、sedまたはawk以外には使用できません。

答え1

Awk方法:

awk '$1=="keyword:"{ getline k < "file2"; print $1, "\047" k "\047"; next }1' file1

出力:

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

代わりにsed内部置換を使用します。

$ sed -Ei "s/^(keyword: ).*/\1'$(cat file2)'/" file1

答え2

$ cat tst.awk
NR == FNR {
    new = (NR>1 ? new ORS : "") $0
    next
}
$1 == "keyword:" {
    $0 = $1 OFS "\047" new "\047"
}
{ print }

$ awk -f tst.awk file2 file1
not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

答え3

この問題には、YAML をサポートしないツールを使用するソリューションが必要です。解決策を提示しています。yqアンドレイ・キースリューク(Mike Farahではありませんyq)YAMLをサポートしています。

yq -Y '.keyword = input' file newdata

質問のデータ出力を提供します。

not_keyword: 'something'
keyword: 'condition 1 condition 2 condition 3'
another_not_keyword: 'something'

内部編集を使用-iまたは実行できます。--in-place

関連情報