{
"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
:
[
在输入的第一行的开头插入 a 。]
在最后一行输入的末尾插入一个。-
替换以单个逗号开头的任何行。- 删除以任意数字开头的行。
调用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