我有一个典型的 Chef .json 文件,例如服务器名.json
{
"name": "myserver123",
"chef_environment": "test",
"run_list": [
"role[base-pkg]",
"role[interesting_stuff]",
"role[user_apps]"
]
}
我想做的是使用“one liner”在文件中找到的最后一个角色之后添加一个新角色。因为我不知道文件中有哪些角色或有多少角色,所以我想搜索最后一个结束 "]" 括号并在其上方添加新角色。
我尝试了以下方法:
tac servername.json | sed -i '0,/\]/a "role[My_New_Role]"'
认为这会找到(现在)第一个“]”并在其后添加新行。但是,当我运行 cmd 时,它会添加 3 次“role[My_New_Role]”行。在 "]" 之前 两次 和在 "]"之后的正确位置 一次
问题:
1)为什么“0”表示匹配一次时该行添加了3次?
2) 使用 AWK、Perl 或 Python (2.7.5) 会更好吗?怎么样?
3) 我应该使用正则表达式先行/后行而不是 tac 吗?
4) 由于我需要再次处理文件以在倒数第二个角色中添加一个逗号,也许我的整个方法是错误的?什么是更好的方法?
请您参考如下方法:
带有 JSON 模块的 Perl:
cat servername.json | perl -MJSON -0 -ne '$j = decode_json($_); push @{$j->{run_list}}, q<role[My_New_Role]>; print encode_json($j)'
您可以通过将打印命令替换为 print to_json($j, {pretty => 1})
