用jq处理多个顶级元素

时间:2019-01-06 22:40:54

标签: json stream edit jq deluge

我正在尝试使用deluge来修改web.conf jq文件,但是遇到了一些问题。洪水Web配置似乎是无效的json

{
  "file": 1,
  "format": 1
}
{
  "sidebar_show_zero": false,
  "show_session_speed": false,
  "pwd_sha1": "CHANGEME",
  "show_sidebar": true,
  "sessions": {},
  "enabled_plugins": [],
  "base": "/",
  "first_login": true,
  "theme": "gray",
  "pkey": "ssl/daemon.pkey",
  "default_daemon": "",
  "cert": "test",
  "session_timeout": 3600,
  "https": false,
  "interface": "0.0.0.0",
  "sidebar_multiple_filters": true,
  "pwd_salt": "salt",
  "port": 8112
}

它具有多个顶级元素,这些元素之间没有逗号分隔,因此,如果我尝试使用jq这样的jq '.pwd_sha1 = "NEW HASH"' web.conf编辑文件,则会得到以下信息

{
  "file": 1,
  "format": 1,
  "pwd_sha1": "NEW HASH"
}
{
  "sidebar_show_zero": false,
  "show_session_speed": false,
  "pwd_sha1": "NEW HASH",
  "show_sidebar": true,
  "sessions": {},
  "enabled_plugins": [],
  "base": "/",
  "first_login": true,
  "theme": "gray",
  "pkey": "ssl/daemon.pkey",
  "default_daemon": "",
  "cert": "test",
  "session_timeout": 3600,
  "https": false,
  "interface": "0.0.0.0",
  "sidebar_multiple_filters": true,
  "pwd_salt": "salt",
  "port": 8112
}

jq正在向第一个顶级对象添加新元素,并更改第二个顶级元素的值。我如何才能仅更改第二个顶级元素中的现有项目?

1 个答案:

答案 0 :(得分:2)

您显示的web.conf是JSON实体流。对您来说幸运的是,jq是面向流的,从您的示例中可以看出,您可以简单地编写:

jq 'if .pwd_sha1 then .pwd_sha1 = "NEW HASH" else . end' web.conf

不过,通常来说,用更严格的测试来编写某些内容可能更合适,例如

jq 'if type == "object" and has("pwd_sha1") 
  then .pwd_sha1 = "NEW HASH" else . end' web.conf

“更改第二个顶级元素的值”

要仅编辑第二个顶级项目,可以将foreach inputs与-n命令行选项一起使用:

foreach inputs as $in (0; .+1; 
  if . == 2 then $in | .pwd_sha1 = "NEW_HASH" 
  else $in end)