如何用“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 对象运行过滤器,而是将整个输入流读取到一个大数组中


内容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. ]在最后一行输入的末尾插入一个。
  3. -替换以单个逗号开头的任何行。
  4. 删除以任意数字开头的行。

调用jq是可选的(它仅整理格式)。

输出:

[
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  },
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  }
]

jq -s使用or 的简短替代方案jq --slurp

sed -e '/^[-0-9]/d' file | jq -s

相关内容