当使用猫时,sed没有替换所有出现的事件

时间:2017-03-29 19:23:40

标签: sed

当我将以下内容应用于文件的尾部时:

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"},
]

1 个答案:

答案 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提供了一些帮助。