herhuf
herhuf

Reputation: 517

Split a string and trim a known prefix from each part in a complex JSON structure

I'm dealing with a fairly complex JSON-structure in which a single entry needs to be edited in several places. For example:

[
    {
        "name": "test 1",
        "stuff": {
            "properties": {
                "id": 0,
                "stuff_list": [
                    {
                        "entryId": 1,
                        "description": "- item 1\n- item 2\n- item 3"
                    },
                    {
                        "entryId": 2,
                        "description": "- item 1\n- item 2\n- item 3"
                    }
                ]
            }
        }
    },
    {
        "name": "test 2",
        "stuff": {
            "properties": {
                "id": 1,
                "stuff_list": [
                    {
                        "entryId": 1,
                        "description": null
                    },
                    {
                        "entryId": 2,
                        "description": "- item 1\n- item 2\n- item 3"
                    }
                ]
            }
        }
    }
]

Here I would like to edit each "description"-element: The string needs to be split at each \n and the substrings "^\n?-\s" of each resulting array element need to be removed. So it should result in:

{
    "entryId": 1,
    "description": ["item 1", "item 2", "item 3"]
}

My first approach is:

jq '.[].stuff.properties.stuff_list[].description | split("\n")' the_file.json

but that's not working in the first place becaue of the null values that can occur at some places. So now I wonder: how can I achieve what I want?

Upvotes: 2

Views: 379

Answers (1)

Inian
Inian

Reputation: 85600

An alternate version using split() on the \n and trimming string - on the left, would be to do

.[].stuff.properties.stuff_list[].description |= 
  if . != null then 
    split("\n") | map(ltrimstr("- ")) 
  else 
    . 
  end

jqplay - Demo

Upvotes: 3

Related Questions