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":
那个 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)。此外,如果您的字段可以包含双引号,则它可能需要自己的转义。