説明する

説明する

このようなファイルがあります。

103710:v2HAbAFH029324:[email protected]:localhost:Sent
103821:CCFE5609E3:[email protected]:localhost:bounced
103922:DFF19609E2:[email protected]:localhost:Deferred

私はそれに変更する必要があります。

{"randomId":{"s":"103710"},"id":{"s":"v2HAbAFH029324"},"userId":{"s":"[email protected]"},"dns":{"s":"localhost"},"status":{"s":"Sent"}}
{"randomId":{"s":"103821"},"id":{"s":"CCFE5609E3"},"userId":{"s":"[email protected]"},"dns":{"s":"localhost"},"status":{"s":"bounced"}}
{"randomId":{"s":"103922"},"id":{"s":"DFF19609E2"},"userId":{"s":"[email protected]"},"dns":{"s":"localhost"},"status":{"s":"Deferred"}}

このコードが欲しい

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

最初の発生:add {"id":{"s":、2番目の発生add{"userId":{"s":

ベストアンサー1

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

printf代わりに、よりおなじみのものを使用すると、必要なechoシーケンス\"をすべて回避できます。echo行の末尾にバックスラッシュを使用して区切ります。

注:生成する形式はJSONと呼ばれ、それを生成するのに役立つツールがあるかもしれません(例:ジャック)。また、フィールドに二重引用符を含めることができる場合は、独自のエスケープが必要になる場合があります。

おすすめ記事