I've got a JSON structure for projects and tasks:
{
"project1": [
"task1a",
"task1b"
],
"project2": [
"task2a",
"task2b",
"task2c"
]
}
which I'd like to convert to MD-like list:
* project1
* task1a
* task1b
* project2
* task2a
* task2b
* task2c
mainly using jq
and sh
/bash
the best I can do is:
jq '. | to_entries | .[] | .value |= " * " join("\n * ") "\n" | .key = "* " .key'
but then I'm stuck trying to properly print .value
string along with .key
CodePudding user response:
Yet another solution, without the update operator |=
, without the join()
builtin and without explicit newline characters \n
:
jq -r 'to_entries[] | "* \(.key)", " * \(.value[])"'
* project1
* task1a
* task1b
* project2
* task2a
* task2b
* task2c
CodePudding user response:
Another solution, using join()
and string interpolation:
to_entries[] | "* \(.key)\n * \(.value | join("\n * "))"
Will produce:
* project1
* task1a
* task1b
* project2
* task2a
* task2b
* task2c
jq -r 'to_entries[] | "* \(.key)\n * \(.value | join("\n * "))"' input
JqPlay Demo
CodePudding user response:
You're very close. Add -r
to output raw strings instead of JSON, and use | .key, .value
to output the key and value strings as separate items so they are shown on adjacent lines.
jq -r '. | to_entries | .[] | .value |= " * " join("\n * ") | .key = "* " .key | .key, .value'