複数行を「sed」に置き換えてJSONに変換するには?

複数行を「sed」に置き換えてJSONに変換するには?
{
  "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:

  1. [入力の最初の行の先頭に a を挿入します。
  2. ]入力の最後の行の末尾に1つを挿入します。
  3. -単一のカンマで始まるすべての行を置き換えます。
  4. 任意の数字で始まる行を削除します。

呼び出しは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

関連情報