Bashパイプラインのストリーム処理を使用して連続した単一のデータ行を処理しますか?

Bashパイプラインのストリーム処理を使用して連続した単一のデータ行を処理しますか?

指定されたネットワークポートに連続した1行のテキストを出力する組み込みサーバーをデバッグしています。ストリームどこにも改行文字はありませんがテキストデータなので、出力時の形式を指定したいと思います。ストリームの文字を有効な改行文字に置き換えるためにtr(翻訳)を使用してみましたが、常に改行文字で適切に置き換えることができる唯一の単一文字を見つけることは不可能でした。私の最初の考えは、sedを使用して2-3文字パターンに改行を追加することでしたが、sedは行ベースでストリームは無限の単一行なので、sedはプロセスを完了しません! sedの非ラインベースの代替案はありますか?

答え1

fold目的は次のとおりです。

NAME
       fold - wrap each input line to fit in specified width

SYNOPSIS
       fold [OPTION]... [FILE]...

DESCRIPTION
       Wrap input lines in each FILE, writing to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory  arguments  to  long options are mandatory for short options
       too.

       -b, --bytes
              count bytes rather than columns

       -s, --spaces
              break at spaces

       -w, --width=WIDTH
              use WIDTH columns instead of 80

       --help display this help and exit

       --version
              output version information and exit

上に示すように、幅に基づいて行を縮小して100個の文字行を取得します。

command_that_reads_from_port | fold -w 100

これはGNU coreutilsの一部である標準プログラムなので、すべてのGNUシステムに存在する必要があります。

答え2

解決策は次のとおりです。

stdbuf -o0 ncat -ul 51002 | stdbuf -o0 fold | sed "s/\[15/\&\[15/g" -u | stdbuf -o0 tr -d '\n' | tr "&" "\n"

ここで [15 は、前に改行文字を追加したいパターンです。いくつかの解決策ですが、うまく動作します。

答え3

投稿した回答によると、マルチキャラRSとRTにGNU awkを使用すると、次のような内容が必要になることがあります。

$ printf '%s' 'foo[15bar[15and stuff' |
    awk -v RS='[[]15' '{print pRT $0; pRT=RT}'
foo
[15bar
[15and stuff

ただし、サンプル入力/出力がない場合、これは推測です。 awkスクリプト内のデータに対して必要なすべての操作を実行でき、特定の[15数の区切りレコードまたは特定の文字数の後にデータ処理を停止するには、単に数を追加して終了するだけです。 20録音後終了:

awk -v RS='[[]15' '{print pRT $0; pRT=RT} NR==20{exit}'

または1000文字以降:

awk -v RS='[[]15' '{$0=pRT $0; n+=length(); print; pRT=RT} n==1000{exit}'

またはあなたが好きなもの。

必要に応じて stdbuf セクションを追加します。

関連情報