Linux命令从stdin替换字符而不用'\ n'

时间:2017-07-11 07:06:49

标签: linux bash awk sed

我运行一个像nc这样的命令,输出类似{"foo1":"bar1"}{"foo2":"bar2"}的内容,不连续换行。 我想更改输出如下:

{"foo1":"bar1"}
{"foo2":"bar2"}

我尝试了nc -U /dev/mysocket | sed 's/}/}\n/g',但它不起作用。如果sed没有'\ n',则nc似乎不会处理输入。

如果您没有可以输出上述样本的#include <stdio.h> #include <unistd.h> int main() { while (1) { printf("{\"foo1\":\"bar1\"}"); fflush(0); sleep(1); } return 0; } 服务器。它更像是hello.c的以下输出:

gcc -o hello hello.c; ./hello | sed 's/}/}\n/g'

所以案件结果如下: .main-box{ background:#ddd; width:300px; height:100px; display:inline-block; position:relative; text-align:center; } .main-box:after{ content:''; width: 0; height: 0; border-bottom: 70px solid #999; border-right: 70px solid transparent; position:absolute; left:0; bottom:0; } .main-box:before{ content:''; width: 0; height: 0; border-bottom: 70px solid #999; border-left: 70px solid transparent; position:absolute; right:0; bottom:0; }无效。如果没有'\ n',似乎sed甚至不处理输入流。 关于如何解决这个问题的任何想法?谢谢。

2 个答案:

答案 0 :(得分:7)

您可以使用awk

echo '{"foo1":"bar1"}{"foo2":"bar2"}' | awk -v RS='}' -v ORS='}\n' 'NF'
{"foo1":"bar1"}
{"foo2":"bar2"}

否则,您可以使用此sed

echo '{"foo1":"bar1"}{"foo2":"bar2"}' | sed $'s/}{/}\\\n{/g'
{"foo1":"bar1"}
{"foo2":"bar2"}

如果您有gnu sed,那么以下内容也会有效:

echo '{"foo1":"bar1"}{"foo2":"bar2"}' | gsed 's/}{/}\n{/g'
{"foo1":"bar1"}
{"foo2":"bar2"}

但请注意您的输入是JSON,并且您可以使用jq获得漂亮的打印效果:

echo '{"foo1":"bar1"}{"foo2":"bar2"}' | jq .
{
  "foo1": "bar1"
}
{
  "foo2": "bar2"
}

答案 1 :(得分:0)

要插入换行符(\ n),请将其与&一起使用,如下所示:

nc -U /dev/mysocket | sed 's/}/}&\n/g'