当我将以下内容应用于文件的尾部时:
tail test9 | sed -e '/},/N;s/,\n*\]/]/g' >wtf
我得到了正确的结果:
{"_id":{"},oid":"58dc04a9fbca629d612f1905"},"memberID":"114526","gender":"M","a ge":"33","ethnicOriginCountryName":"Egypt","sect":"SU"},
{"_id":{"},oid":"58dc04a9fbca629d612f190d"},"memberID":"114534","gender":"M","age":"24","ethnicOriginCountryName":"United Kingdom","sect":"SU"}]
然而当使用猫
时cat test9 | sed -e '/},/N;s/,\n*\]/]/g' >wtf
我没有得到正确的结果:
{"_id":{"},oid":"58dc04a9fbca629d612f1905"},"memberID":"114526","gender":"M","age":"33","ethnicOriginCountryName":"Egypt","sect":"SU"},
{"_id":{"},oid":"58dc04a9fbca629d612f190d"},"memberID":"114534","gender":"M","age":"24","ethnicOriginCountryName":"United Kingdom","sect":"SU"},
]
答案 0 :(得分:0)
在N
中使用sed
命令有其局限性。如果输入是一对线,它可以工作。在您的情况下,输入不仅仅是一对行,而是以]
结束的段落。
解决方案是继续阅读整段,然后用\n,]
替换,]
,最后打印段落。
sed -e '1h;1!H;/]/!d' -e 'x;s/,\n]/]/;s/]\n//' test9
以下是sed
个命令的作用:
1h
- 如果是第1行,则用模式空间的内容替换保留空间。
1!H
- 除第1行外,在换行符空格后附加一个换行符,后跟样式空间的内容。
/]/!d
- 删除模式空间,除非它包含模式/]/
。
x
- 交换模式的内容并保留空格。
s/,\n]/]/
- 将,\n]
替换为,]
。
s/]\n//
- 删除无意中预先设置的模式]\n
。
在使用sed
对象时,建议的一句话json
不是正确的工具。使用jq
。你的输入似乎是一个破碎的(受损的)json,因此jq
将不再使用它。
感谢@Yunnosch提供了一些帮助。