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

2024-09-30 10:34:33 发布

您现在位置:Python中文网/ 问答频道 /正文

一个典型的Chef.g.json文件。服务器名.json在

{

  "name": "myserver123",

  "chef_environment": "test",

  "run_list": [

    "role[base-pkg]",

    "role[interesting_stuff]",

    "role[user_apps]"


  ]

}

我想做的是使用“一行程序”在文件中找到的最后一个角色之后添加一个新角色。因为我不知道文件中有哪些角色或有多少角色,所以我想搜索最后一个结束的"]"括号并在其上方添加新角色。在

我尝试了以下方法:

^{pr2}$

以为这会找到(现在)第一个“]”并在它后面添加新行。但是,当我运行cmd时,它会添加行“role[My_New_role]”3次。两次"]"之前,一次"]"之后的正确位置

问题:

1)为什么当“0”表示匹配一次时,该行加了3次?在

2)使用AWK、Perl或Python(2.7.5)更好吗?怎样?在

3)是否应该使用regex lookahead/behind而不是tac?在

4)因为我需要再次处理该文件,以便在倒数第二个角色中添加逗号,可能我的整个方法是错误的?什么是更好的方法?在


Tags: 文件方法runnametest服务器json角色
2条回答

我不知道这是否是最好的方法(vs sed、AWK或Perl),但是使用python的json库可以很容易地完成您的要求。在

import json

# read the file as a dict using json.loads
d = json.loads(open('servername.json', 'r').read())

# add your new role to the end of the run_list
d['run_list'].append('role[My_New_Role]')

# write new json to file (specify a new file, or overwrite if you prefer)
open('new_servername.json', 'w').write(json.dumps(d, indent=2))

输出文件如下所示:

^{pr2}$

很容易将此代码修改为以文件名作为输入的脚本,这样就很容易多次运行。在

带有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命令替换为print to_json($j, {pretty => 1})来很好地打印它

相关问题 更多 >

    热门问题