使用 jq 处理多个顶级元素
Handling multiple top level elements with jq
我正在尝试使用 jq
修改 deluge
web.conf
文件,但我遇到了一些问题。 deluge 网络配置似乎无效 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
正在向第一个顶级对象添加新元素并更改第二个顶级元素的值。我怎样才能让它只更改第二个顶级元素中的现有项目?
您显示的 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
"changing the second top level element's value"
要仅编辑第二个顶级项目,您可以使用 foreach inputs
和 -n 命令行选项:
foreach inputs as $in (0; .+1;
if . == 2 then $in | .pwd_sha1 = "NEW_HASH"
else $in end)
我正在尝试使用 jq
修改 deluge
web.conf
文件,但我遇到了一些问题。 deluge 网络配置似乎无效 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
正在向第一个顶级对象添加新元素并更改第二个顶级元素的值。我怎样才能让它只更改第二个顶级元素中的现有项目?
您显示的 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
"changing the second top level element's value"
要仅编辑第二个顶级项目,您可以使用 foreach inputs
和 -n 命令行选项:
foreach inputs as $in (0; .+1;
if . == 2 then $in | .pwd_sha1 = "NEW_HASH"
else $in end)