如何使用Bash删除json文件中的最后一个逗号?

时间:2016-04-24 13:26:24

标签: json bash shell awk sed

我编写了一些脚本,它获取了aws ec2实例的所有用户数据,并回显了local.json。当我安装node.js模块时会发生这一切。 我不知道如何删除json文件中的最后一个逗号。这是bash脚本:

#!/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

以这种方式运行他:./ script 我得到了json(OUTPUT),但是在所有行中都有逗号。这是我得到的local.json:

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

我想做的就是删除json文件的最后一行 - 逗号(“,”)。 我尝试了许多方法,我在互联网上找到了。我知道它应该是在最后的“fi”之后(循环结束)。而且我知道它应该是这样的:

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

或者这个:

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

但他们不适合我。 有人可以帮助我吗?谁知道Bash脚本很好? 谢谢!

4 个答案:

答案 0 :(得分:3)

如果你知道它是最后一个需要替换的逗号,那么一个相当健壮的方法是在“slurp”模式下使用GNU sed:

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

输出:

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

答案 1 :(得分:2)

如果您只是发布一些示例输入/输出,它会删除猜测工作,但如果这是您的输入文件:

$ cat file
Env=dev
EngineUrl=engine.url.net

然后,如果你正在尝试做我认为你的事,那么你需要的就是:

$ cat tst.awk
BEGIN { FS="="; sep="{\n" }
{
    printf "%s    \"%s\" : \"%s\"", sep, $1, $2
    sep = ",\n"
}
END { print "\n}" }

你执行的目的是:

$ awk -f tst.awk file
{
    "Env" : "dev",
    "EngineUrl" : "engine.url.net"
}

如果您愿意,也可以在shell脚本中内联执行awk脚本:

awk '
BEGIN { FS="="; sep="{\n" }
{
    printf "%s    \"%s\" : \"%s\"", sep, $1, $2
    sep = ",\n"
}
END { print "\n}" }
' file
{
    "Env" : "dev",
    "EngineUrl" : "engine.url.net"
}

上面的内容比你发布的shell脚本更强大,更便携,更高效,更好,因为它使用了正确的工具。 UNIX shell是一种环境,可以使用该语言调用工具来对这些调用进行排序。它不是处理文本的语言,这就是为什么它很难正确处理。用于一般文本处理的UNIX工具是awk,所以当你需要在UNIX中处理文本时,你只需要shell调用awk,就是这样。

答案 2 :(得分:2)

如果jq版本可用,请点击此处

jq --raw-input 'split("=") | {(.[0]):.[1]}' /instance-config | jq --slurp 'add'

通过一次jq通行证可能有办法实现,但我无法看到它。

答案 3 :(得分:0)

如果您愿意使用它, 对尾随逗号相当宽容:

xidel -s local.json -e '$json'
{
  "Env": "dev",
  "EngineUrl": "engine.url.net"
}
xidel - -se '$json' <<< '{"Env":"dev","EngineUrl":"engine.url.net",}'
#or
xidel - -se 'parse-json($raw,{"liberal":true()})' <<< '{"Env":"dev","EngineUrl":"engine.url.net",}'
{
  "Env": "dev",
  "EngineUrl": "engine.url.net"
}