Skip to main content
added 497 characters in body
Source Link
Kusalananda
  • 356.2k
  • 42
  • 737
  • 1.1k
jq -n 'reduce $ARGS.positional[] as $pathname ({}; 
    .policies.Certificates.Install += [[[
        ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), 
        $pathname
    ]]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "policies": {
    "Certificates": {
      "Install": [
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}

(Note that {"cert1.der","/home/username/cert1.pem"} is valid JSON, but is equivalent to {"cert1.der":null,"/home/username/cert1.pem":null}, which is unlikely what you want.)

$ cat my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ]
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem <my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ],
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]]])' my-file.json --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ],
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}
jq -n 'reduce $ARGS.positional[] as $pathname ({}; 
    .policies.Certificates.Install += [
        ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), 
        $pathname
    ])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "policies": {
    "Certificates": {
      "Install": [
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}
$ cat my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem"
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem <my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem",
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ])' my-file.json --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem",
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}
jq -n 'reduce $ARGS.positional[] as $pathname ({}; 
    .policies.Certificates.Install += [[
        ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), 
        $pathname
    ]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "policies": {
    "Certificates": {
      "Install": [
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}

(Note that {"cert1.der","/home/username/cert1.pem"} is valid JSON, but is equivalent to {"cert1.der":null,"/home/username/cert1.pem":null}, which is unlikely what you want.)

$ cat my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ]
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem <my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ],
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}
$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [[ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ]])' my-file.json --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        [
          "certX.der",
          "/home/username/certX.pem"
        ],
        [
          "cert1.der",
          "/home/username/cert1.pem"
        ],
        [
          "cert2.der",
          "/home/username/cert2.pem"
        ],
        [
          "cert-B.der",
          "/home/username/cert-B.pem"
        ]
      ]
    }
  }
}
Source Link
Kusalananda
  • 356.2k
  • 42
  • 737
  • 1.1k

To generate the given JSON from a list of pathnames of .pem files, you may use jq and its reduce() functionality to build up the array:

jq -n 'reduce $ARGS.positional[] as $pathname ({}; 
    .policies.Certificates.Install += [
        ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), 
        $pathname
    ])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem

Given the pathnames at the end of the command (which could be an expansion of some filename globbing pattern, such as ~username/*.pem), the list of pathnames ($ARGS.positional) is added one by one to the Install array. We also strip the .pem filename suffix and the directory path to create the corresponding .der string.

The command above would generate the following JSON:

{
  "policies": {
    "Certificates": {
      "Install": [
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}

If you would want to add this to an already existing JSON document, then just replace the {} in the reduce() call with input and pass the name of the file to the jq command before the --args option or on the command's standard input stream:

$ cat my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem"
      ]
    }
  }
}

Feeding the existing JSON document on standard input with a redirection:

$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ])' --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem <my-file.json
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem",
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}

Or passing the name of the file on jq's command line:

$ jq -n 'reduce $ARGS.positional[] as $pathname (input; .policies.Certificates.Install += [ ($pathname | rtrimstr(".pem") + ".der" | sub(".*/";"")), $pathname ])' my-file.json --args /home/username/cert1.pem /home/username/cert2.pem /home/username/cert-B.pem
{
  "name": "Sebastian",
  "policies": {
    "Certificates": {
      "Install": [
        "certX.der",
        "/home/username/certX.pem",
        "cert1.der",
        "/home/username/cert1.pem",
        "cert2.der",
        "/home/username/cert2.pem",
        "cert-B.der",
        "/home/username/cert-B.pem"
      ]
    }
  }
}