【问题标题】:Handling multiple top level elements with jq使用 jq 处理多个顶级元素
【发布时间】:2019-06-01 15:46:57
【问题描述】:

我正在尝试使用jq 修改deluge web.conf 文件,但遇到了一些问题。洪水网络配置似乎是无效的 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 正在向第一个顶级对象添加一个新元素并更改第二个顶级元素的值。我怎样才能让它只更改第二个顶级元素中的现有项目?

【问题讨论】:

  • jq 'if has("pwd_sha1") then .pwd_sha1="NEW_HASH" else . end' web.conf;但为什么不deluge-console 'config -s pwd_sha1 "NEW_HASH"'
  • @Amadan 可以,但我不能这样做deluge-console,因为这是一个 docker 映像,我正在 bash 安装脚本中应用配置。我可能会使用它,但它会比使用jq 更复杂

标签: json stream edit jq deluge


【解决方案1】:

您显示的 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

"改变第二个顶级元素的值"

要仅编辑第二个顶级项目,您可以使用带有 -n 命令行选项的 foreach inputs

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

【讨论】:

  • 这可行,但您需要将 if .pwd_sha1 更改为 if has("pwd_sha1") 否则它将与具有 false 值的现有项目不匹配
  • @vane - 你读过以“一般来说,不过,......”开头的段落吗?
  • 是的,但即便如此,第一条语句仍然是不正确的,因为它在某些情况下会失败,你不会知道为什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多