我编写了一些脚本,它获取了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脚本很好? 谢谢!
答案 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 对尾随逗号相当宽容:
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"
}