2017-01-16 2 views
0

Я использую jq для анализа и изменения ответа cURL, и он отлично подходит для всех моих требований, кроме одного. Я хотел бы изменить значение ключа в формате JSON, например:Bash jq изменить json: get и set

A) Входной

JSON
[ 
    { 
     "id": 169, 
     "path": "dir1/dir2" 
    } 
] 

B) Выход JSon

[ 
    { 
     "id": 169, 
     "path": "dir1" 
    } 
] 

Так последний каталог удаляется из пути. Я использую сценарий:

curl --header -X GET -k "${URL}" | jq '[.[] | {id: .id, path: .path_with_namespace}]' | jq '(.[] | .path) = "${.path%/*}"' 

Последний канал, конечно, не правильный, и это то место, где я застрял. Дело в том, чтобы получить значение path и изменить его. Любая помощь приветствуется.

ответ

2

Один из способов сделать это состоит в использовании split и join обрабатывать путь, и использовать |= связать правильное выражение для атрибута .path.

... | jq '.[] | .path|=(split("/")[:-1]|join("/")) 
  • split("/") принимает строку и возвращает массив
  • x[:-1] возвращает массив, состоящий из всех, кроме последнего элемента x
  • join("/") сочетает в себе элементы входящего массива с / вернуть единый строка.
  • .path|=x принимает значение .path, передает его через фильтр x и снова присваивает результирующее значение .path.
+0

Отлично, спасибо тонну: D – Sid