sedを使用して連続ストリーム出力を操作するには?

sedを使用して連続ストリーム出力を操作するには?

私は技術知識のない視聴者のためのプレゼンテーションを準備しています。連続した値ストリームを出力するbashで実行されるプログラムがあり、そのいくつかは重要です。視聴者がその頻度を理解できるように、表示された重要な結果を強調したいと思います。問題は、sed実行中のストリームで操作を実行できないことです。結果を次のファイルに入れると、うまく動作します。

cat output.txt | sed "s/some text/some text bolded/"

ただし、次のように実行出力に対して同じ操作を試みると:

command | sed "s/some text/some text bolded/"

sed何もしませんでした。どんなアイデアがありますか?

Lambertが有用に指摘したように、「sed何もしない」という私の声明はあいまいです。何が起こるかは、プログラムがstdoutパイプで接続されているにもかかわらず正常に出力されることです(書かないと確信しています)。stderrsed

問題は、コマンドが2番目のプログラムを呼び出してから標準出力に出力することです。最初のプログラムは、私が編集できる数行を印刷します。次に、2番目のプログラムで印刷された値のストリームがあります。これらの値は編集できません。

Perl メソッドと awk メソッドも動作しません。

答え1

コマンドの出力がバッファリングされる可能性が高いです。コマンドが端末に書き込まれると、バッファは改行するたびにフラッシュされるため、予想される速度で表示されることがわかります。コマンドがパイプに書き込まれると、バッファは数キロバイトに達したときにのみフラッシュされるため、多くの遅延が発生します。これは標準入力/出力ライブラリのデフォルト動作です。

コマンドが出力に影響を与えないようにするには、unbuffer(予想から)またはstdbuf(GNU coreutilsで)を使用できます。

unbuffer command | sed …
stdbuf -o0 command | sed …

答え2

sedオプションがあります:

-u, --バッファリングなし

入力ファイルから最小限のデータをロードし、出力バッファをより頻繁にフラッシュします。man sed詳細は参照してください。

答え3

私はawkを使用します

  command | awk '/some important stuff/ { printf "%c[31m%s%c[0m\n",27,$0,27 ; next }
  { print ; } '

どこ

  • /some important stuff/sedなどの重要な行を選択してください。
  • printf "%c[31m%s%c[0m\n",27,$0,27 ;赤で印刷
    • 緑、黄色には32,33を使用してください。
    • $ 1、$ 2は特定のフィールドを選択するために使用できます。
  • 他の行は「現状のまま」印刷されます。

重要なのは、command行をフラッシュする必要があることです。ただし、出力量が多い場合はこれを行う必要があります。

答え4

パール方式:

command | perl -pe 's/(stuff)/\x1b[1m$1\x1b[0m/g'

または連続出力:

bashスクリプト出力cont

#!/bin/bash
while [ true ]
do
   echo "Some stuff"
done

テスト:

./cont | perl -pe 's/(stuff)/\x1b[1m${1}\x1b[0m/g'
  • \x1b[1m- 大胆に表現したり、強烈さを加えてみてください。
  • ${1}- 逆参照
  • \x1b[0m-すべての属性をリセットします。

出力:

一部もの
一部もの
一部もの
一部もの

追加エスケープコードここ

関連情報