使用shell进行循环处理JSON

时间:2019-03-04 13:43:13

标签: shell

这是我的shell代码,我的问题是我不需要json文件末尾的','。

#!/bin/bash
PATCH_VERSION_FILE=/root/workspace/patch_version.json
filepath=/root/workspace/txtdir
for file in "${filepath}"/*.txt; do
    echo "    {" >> ${PATCH_VERSION_FILE}
    filename=`echo ${file} | awk -F'/' '{ print $(NF) }'`
    filemd5=`md5sum "${file}" | awk '{ print $1 }'`

    echo "    \"${filename}\"":"\"$filemd5\"">>${PATCH_VERSION_FILE}
    echo "    },">>${PATCH_VERSION_FILE}
done

输出:

{
"2001.txt":"d41d8cd98f00b204e9800998ecf8427e"
},
{
"2002.txt":"d41d8cd98f00b204e9800998ecf8427e"
},
{
"2003.txt":"d41d8cd98f00b204e9800998ecf8427e"
},
{
"2004.txt":"d41d8cd98f00b204e9800998ecf8427e"
},
{
"2005.txt":"d41d8cd98f00b204e9800998ecf8427e"
},

我找到了一种解决方案,但是看起来很丑,下面的代码:

n=0
for file in "${filepath}"/*.txt; do
    if [ $n -ne 0 ];then
        echo "    ," >> ${PATCH_VERSION_FILE}
    fi

    echo "    {" >> ${PATCH_VERSION_FILE}
    filename=`echo ${file} | awk -F'/' '{ print $(NF) }'`
    filemd5=`md5sum "${file}" | awk '{ print $1 }'`

    echo "    \"${filename}\"":"\"$filemd5\"">>${PATCH_VERSION_FILE}
    echo "    }">>${PATCH_VERSION_FILE}
    n=$(( $n + 1 ))
done

但是','与'}不在同一行,是否有任何方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以在脚本末尾(在for循环之后)添加此代码。它只会删除文件的最后一个字符(实际上将替换为空字符串):

sed -i '$ s/.$//' $PATCH_VERSION_FILE

答案 1 :(得分:0)

为了拥有有效的JSON数据,可以使用jq之类的JSON感知工具:

md5sum "$filepath"/*.txt | jq -R 'split("  ")|{(.[1]):.[0]}' >> ${PATCH_VERSION_FILE}

-R选项允许jqmd5sum读取字符串。

将字符串拆分为2,然后分配给键/值对象。