2017-07-11 5 views
1

ncのようなコマンドを実行し、改行なしで{"foo1":"bar1"}{"foo2":"bar2"}のように出力します。 私は、次のような出力を変更したい:' n'なしでstdinの文字を置換するLinuxコマンド

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

私はnc -U /dev/mysocket | sed 's/}/}\n/g'を試してみましたが、それは動作しません。 sedは '\ n'がないと入力を処理しません。

上記のサンプルを出力できるサーバがncの場合はありません。これは、より多くのhello.cのことで、次の出力のようだ:gcc -o hello hello.c; ./hello | sed 's/}/}\n/g'は動作しません :

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    while (1) { 
      printf("{\"foo1\":\"bar1\"}"); 
      fflush(0); 
      sleep(1); 
    } 

    return 0; 
} 

だから場合は、が判明しています。 sedは '\ n'がなければ入力ストリームを処理していないようです。 この問題の解決方法に関するご意見はありますか?ありがとうございました。あなたはawkを使用することができます

答えて

7

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

さもないと、あなたはこのsed使用することができます:あなたはgnu sedには、次がある場合

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

をも動作します:

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

しかし、あなたの入力はJSONであることに注意してください。

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

ありがとう@anubhava。 'awk'コマンドがうまくいくはずです。しかし、実際に私はAndroid上でコマンドを実行しています。 awkコマンドはありません。実際、このケースはもっと複雑です。 ncをシミュレートするために 'echo'を使うのは適切ではありません。私は単純なhello.cを書いてncコマンドをシミュレートし、問題の編集をしました。 – oliver

+0

Androidのsedソースコードは、 'https://android.googlesource.com/platform/external/toybox/ +/master/toys/posix/sed.c'にあります。私は './hello | 'でunbutuから' gnu sed'を試しました。 sed $ 's /} {/} \\\ n {/ g''であり、まだ動作しません。 – oliver

+0

私はsedソースコードは必要ありません。インストールにアクセスできない場合は、単に 'awk'をインストールしてジョブを完了させてください。前述のようにawkはあなたの 'hello'プログラムでも働いていました。 – anubhava

0

は、改行文字(\ n)を挿入するには、以下のよう&でそれを使用する:あなたはとしてはかなりの印刷を取得するためにjqを使用することができます

nc -U /dev/mysocket | sed 's/}/}&\n/g' 
関連する問題