在 shell 脚本中从冒号分隔的数据生成 JSON

kum*_*abu 4 linux shell-script aws

我有一个这样的文件

103710:v2HAbAFH029324:vamsi.vallabhaneni6666@gmail.com:localhost:Sent
103821:CCFE5609E3:vamsi@moxieitcom.moxiecampaigner.com:localhost:bounced
103922:DFF19609E2:no-reply@mavenstaffing.in:localhost:Deferred
Run Code Online (Sandbox Code Playgroud)

我需要将其更改为

{"randomId":{"s":"103710"},"id":{"s":"v2HAbAFH029324"},"userId":{"s":"vamsi.vallabhaneni6666@gmail.com"},"dns":{"s":"localhost"},"status":{"s":"Sent"}}
{"randomId":{"s":"103821"},"id":{"s":"CCFE5609E3"},"userId":{"s":"vamsi@moxieitcom.moxiecampaigner.com"},"dns":{"s":"localhost"},"status":{"s":"bounced"}}
{"randomId":{"s":"103922"},"id":{"s":"DFF19609E2"},"userId":{"s":"no-reply@mavenstaffing.in"},"dns":{"s":"localhost"},"status":{"s":"Deferred"}}
Run Code Online (Sandbox Code Playgroud)

我在想这样的代码

while read line
do     
        sed -i 's/^/{"randomId":{"s":"/' test
        echo $line

        echo $line | grep -q ":"
        [ $? -eq 0 ] && echo "/"{"id":{"s":/"
        [ $? -eq 1 ] && echo "/",{"userId":{"s":/"
        [ $? -eq 2 ] && echo "/",{"host":{"s":/"
        [ $? -eq 3 ] && echo "/",{"status":{"s":/"
        echo "$line | " ";
done < test
Run Code Online (Sandbox Code Playgroud)

添加第一次出现的 : {"id":{"s":然后第二次出现添加{"userId":{"s":

der*_*ert 5

那个 grep/echo 块不会做任何有用的事情;$? 将被设置一次——它不会遍历字段。

值得庆幸的是,似乎有一种更简单的方法可以做到这一点:只需将字段拆分为变量即可。值得庆幸的是,read可以为您做到这一点:

while IFS=':' read -r randomid id userid dns status; do
    printf '{"randomId":{"s":"%s"},"id":{"s":"%s"},"userId":{"s":"%s"},"dns":{"s":"%s"},"status":{"s":"%s"}}\n' \
           "$randomid" "$id" "$userid" "$dns" "$status"
done
Run Code Online (Sandbox Code Playgroud)

使用printf而不是更熟悉的echo可以避免\"-sequencesecho需要的所有内容。请注意行尾的反斜杠以将其拆分。

顺便说一句:您正在生成的格式称为 JSON,并且可能有工具可以帮助生成它(例如,jq)。此外,如果您的字段可以包含双引号,则它可能需要自己的转义。