era*_*amm 1 python perl awk sed chef-infra
我有一个典型的.json文件,用于Chef,例如servername.json
{
  "name": "myserver123",
  "chef_environment": "test",
  "run_list": [
    "role[base-pkg]",
    "role[interesting_stuff]",
    "role[user_apps]"
  ]
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在文件中找到最后一个角色后使用"一行"来添加新角色.因为我从来不知道文件中有什么角色或有多少我想要搜索最后的结束"]"括号并在上面添加新角色.
我尝试了以下方法:
tac servername.json | sed -i '0,/\]/a "role[My_New_Role]"'
Run Code Online (Sandbox Code Playgroud)
认为这会找到(现在)第一个"]"并在其后添加新行.但是,当我运行cmd时,它会添加"role [My_New_Role]"行3次.两次之前"]"和一次之后的正确位置"]"
问题:
1)当"0"表示匹配一次时,为什么该行加3次?
2)使用AWK,Perl或Python(2.7.5)可以做得更好吗?怎么样 ?
3)我应该使用正则表达式前瞻/后面而不是tac吗?
4)因为我需要再次处理文件以向倒数第二个角色添加逗号我的整个方法是错误的?什么是更好的方法?
Perl与JSON模块:
cat servername.json | perl -MJSON -0 -ne '$j = decode_json($_); push @{$j->{run_list}}, q<role[My_New_Role]>; print encode_json($j)'
Run Code Online (Sandbox Code Playgroud)
你可以用print替换print命令来打印它 print to_json($j, {pretty => 1})