パイプ入力(ファイルではなくパイプ)からパターンを新しい行に置き換えます。

パイプ入力(ファイルではなくパイプ)からパターンを新しい行に置き換えます。

netcatを使用して取得した入力ストリームがあります。入力ストリームに改行文字が含まれていません。代わりに、改行には4つのスペースが必要です。したがって、4つのスペースをすべて改行文字に置き換える必要があります。

使ってみました

netcat xxxx | sed 's/    /\n/g' | myscript.sh

だから私はsedまたはawkを介してパイピングを試みましたが、成功しませんでした。どちらのコマンドも、置換を処理する前に入力ストリームの改行文字を無期限に待機しているようです。 sedとawkはどちらもファイルで完全に機能しますが、パイプラインの一部である場合はそうではありません。努力中です

RS='    '

または

-F'    '

しかし、それも動作しませんでした。 sedとawkはどちらも、入力ファイルで実際の改行文字が見つかるまですべてを食べるように見えますが、決して発生しません。

答え1

はい、バッファリングのために死んでいます。 sedが読もうとしています。ワイヤー

これは役に立つかもしれません:

input=""
netcat xxx | while IFS= read -r -d "" -n 1 char; do
    input+=$char
    if [[ $input == *"    " ]]; then
        echo "${input%    }"
        output=""
    fi
done | yourscript.sh

しかし、第二の側面ではより良い方法:入力レコード区切り文字を4つのスペースで定義し、各レコードを印刷します(マルチキャラクタRSはGNU awk機能です)

netcat xxx | gawk -v RS="    " 1 | yourscript.sh

この無限の1行の入力は、bash関数を使用してシミュレートできます。

netcat() { while true; do printf '%d    ' $RANDOM; done; }

関連情報