Skip to main content
 首页 » 编程设计

python之使用 Sed 向 Chef .json 文件添加新角色

2025年05月04日11zdz8207

我有一个典型的 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})

来漂亮地打印它