jsonbashshellawksed

How delete last comma in json file using Bash?


I wrote some script that takes all user data of aws ec2 instance, and echo to local.json. All this happens when I install my node.js modules. I don't know how to delete last comma in the json file. Here is the bash script:

#!/bin/bash
export DATA_DIR=/data
export PATH=$PATH:/usr/local/bin

#install package from git repository
sudo -- sh -c "export PATH=$PATH:/usr/local/bin; export DATA_DIR=/data; npm install git+https://reader:secret@bitbucket.org/somebranch/$1.git#$2"

#update config files from instance user-data
InstanceConfig=`cat /instance-config`
echo '{' >> node_modules/$1/config/local.json
while read line
do
   if [ ! -z "$line" -a "$line" != " " ]; then
      Key=`echo $line | cut -f1 -d=`
      Value=`echo $line | cut -f2 -d=`
      if [ "$Key" = "Env" ]; then
         Env="$Value"
      fi
      printf '"%s" : "%s",\n' "$Key" "$Value" >> node_modules/*/config/local.json
   fi
done <<< "$InstanceConfig"
sed -i '$ s/.$//' node_modules/$1/config/local.json
echo '}' >> node_modules/$1/config/local.json

To run him im doing that way: ./script I get json(OUTPUT), but with comma in all lines. Here is local.json that I get:

{
    "Env" : "dev",
    "EngineUrl" : "engine.url.net",
}

All I trying to do, is delete in last line of the json file - comma(","). I try many ways, that I found in internet. I know that it should be after last "fi"(end of the loop). And I know that it should be something like this line:

sed -i "s?${Key} : ${Value},?${Key} : ${Value}?g" node_modules/$1/config/local.json

Or this:

sed '$ s/,$//' node_modules/$1/config/local.json

But they not work for me. Can someone help me with that? Who knows Bash scripting well? Thanks!


Solution

  • If you know that it is the last comma that needs to be replaced, a reasonably robust way is to use GNU sed in "slurp" mode like this:

    sed -zr 's/,([^,]*$)/\1/' local.json
    

    Output:

    {
      "Env" : "dev",
      "EngineUrl" : "engine.url.net"
    }