将 yaml 字段替换为文件内容

将 yaml 字段替换为文件内容

我最近问了一个与此非常相似的问题,但未能提供足够的反馈来说明该特定案例的解决方案。用更多信息和背景来打开这个问题。

我有两个文件:

文件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进行就地编辑。

相关内容