如何从文本文件中删除换行符,只要它与unix中的此模式不匹配}} \ n

时间:2015-04-28 18:23:04

标签: regex json oracle unix sqlplus

我是oracle和unix世界的新手并且正在努力解决这个问题。 我在文件中假脱机数据。 sql plus的行大小限制为32767,并且返回的任何大于限制的数据记录都会被包装到nextline中。然后将创建的此文件上载到第三方服务,该服务期望json格式的数据仅在结尾处使用换行符,即在}之后

 {"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}

当在假脱机数据时有自动换行时,在换行的每一行之间插入\n字符并打破此json数据。

无论如何我只能在\n之后没有出现这个假脱机文件中的}之类的控制字符? 我可以使用任何unix命令吗?

任何帮助将不胜感激

TIA

2 个答案:

答案 0 :(得分:1)

在不了解您的设置的情况下,一个选项是通过这样的sed脚本来管道文件:

cat input.txt | sed -e ':start; /^{.*]}$/{p;d}; N;s/\n//g; b start;' > output.txt

这基本上如下:

  1. :开始创建一个分支标签以跳转到
  2. / ^ {。*} $ / {p; d} 找到以大括号开头/结尾的行,然后打印它们并转到下一行
  3. N 这只发生在前一行 NOT 找到匹配,并读取下一行
  4. s / \ n // g 删除所有换行符(不用替换它们),
  5. b开始分支(跳转)回到开始标签
  6. 本质上它所做的是读取一行,检查它是否以花括号开头和结尾。如果是,请打印并继续。如果没有,抓住下一行。当然,这假设oracle将始终输出以{和end with}开头的行(即括号之前或之后没有空格)。

答案 1 :(得分:0)

重新关注this answer on a sister site,您在Unix中拥有假脱机文件,可以与awk一起加入行:

awk '{if (sub(/\]}$/,"")) printf "%s]}\n", $0; else printf "%s", $0}' yourfile.lis

如果您开始使用包含以下内容的文件

{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my
cup"}]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}
]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}

...我假装你的输出的第二行和第三行被分成了两个,在早期的}上有一个分割; awk调用将输出:

{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}
{"id":"test","brand":"Disney","variants":[{"pid":"cup","name":"my cup"}]}

您可以将其重定向到新文件。