{
"auth": 'log',
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
24/10/2017 12:44:24
--------------------------------------------------------------------------------
{
"auth": 'log',
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
ファイルの一部のログ行で区切られたjsonのリストを単一のjsonに変換する必要があります。これまで私はこれを試しました:
tac tst.txt | sed '/---------/I,+2 d' | tac > out.json
ログ行を削除しましたが、カンマで置き換えてリストに追加する必要があります。どうすればいいですか?それともPythonを使用する代替方法はありますか?
答え1
sed
+jq
解決策:
sed -E "/^(---|[0-9][0-9])/d; s/'([^']+)'/\"\1\"/" tst.txt | jq -s '' out.json
/^(---|[0-9][0-9])/d
---
- または2桁で始まる不要な行を削除します。s/'([^']+)'/\"\1\"/"
- 一重引用符で囲まれた値を有効なJSON値で置き換えます(二重引用符で囲みます)。jq -s ''
- 入力内のすべてのJSONオブジェクトに対してフィルタを実行するのではなく、入力ストリーム全体を1つの大きな配列に読み込みます。
コンテンツout.json
:
[
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
},
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
]
答え2
二重引用符がlog
二重引用符に変更されたと仮定した場合は、次のようにしますsed
。
sed -e '1s/^/[/' \
-e '$s/$/]/' \
-e 's/^-.*$/,/' \
-e '/^[0-9]/d' file | jq .
表現sed
:
[
入力の最初の行の先頭に a を挿入します。]
入力の最後の行の末尾に1つを挿入します。-
単一のカンマで始まるすべての行を置き換えます。- 任意の数字で始まる行を削除します。
呼び出しはjq
オプションです(フォーマットのみをクリーンアップします)。
出力:
[
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
},
{
"auth": "log",
"appid": 21,
"custid": "599c1f910f53ada8468b4567",
"hwid": "59e719ba0f53adfd6a8b4597"
}
]
jq -s
またはを使用する短い選択肢jq --slurp
:
sed -e '/^[-0-9]/d' file | jq -s