我最近问了一个与此非常相似的问题,但未能提供足够的反馈来说明该特定案例的解决方案。用更多信息和背景来打开这个问题。
我有两个文件:
文件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
进行就地编辑。