指定されたネットワークポートに連続した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 セクションを追加します。