Search code examples
jsonregexobjectjqcapturing-group

jq add capturing group result outside


For example,

Input:

    {
       "id":"abc",
       "name": "name-middlenane-lastname-1"
    },

    {
        "id":"123",
        "name": "fname-flast-2"
    }

response:

    {
         "id":"abc",
         "name": "name-middlename-lastname-1",
         "newkey": "name-middlename-lastname"
    },

    {
          "id":"123",
          "name": "fname-flast-2",
          "newkey": "fname-flast"
    }

The filed name in each object is a string with characters and numbers separated by "-" hyphen. I need the complete string from beginning till the starting number. I don't want anything which is there after the number. And then the add new field with key as newkey and value should be extracted string without the number. Thus, the output should contain old fields as well as new one.


Solution

  • jq solution:

    Sample input.json:

    [
      {
        "id": "abc",
        "name": "name-middlenane-lastname-1"
      },
      {
        "id": "123",
        "name": "fname-flast-2"
      }
    ]
    

    jq 'map(. + (.name | capture("(?<newkey>.+)-[0-9]+")) )' input.json
    

    The output:

    [
      {
        "id": "abc",
        "name": "name-middlenane-lastname-1",
        "newkey": "name-middlenane-lastname"
      },
      {
        "id": "123",
        "name": "fname-flast-2",
        "newkey": "fname-flast"
      }
    ]