Обработка нескольких элементов верхнего уровня с помощью jq - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь изменить файл deluge web.conf с помощью jq, и у меня возникли некоторые проблемы. Кажется, что неверный веб-конфиг 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 голосов
/ 07 января 2019

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)
...