クリッピングによるカラー出力の保存

クリッピングによるカラー出力の保存

bashをインタラクティブに使用する私は、行が端末の幅よりも長くなるのを防ぐためにcutを使用しようとしています。ただし、カラー出力にコマンドを使用すると、すべてのカラーが切り捨てられ、削除されます。たとえば: ls -lG | cut -c 1-$COLUMNS

カラーフォーマットを切り取り保存する方法はありますか?

答え1

ここに2つの質問があります。

  1. ls -G出力が端子(ここではパイプ)に達していない場合は、カラー出力を停止します。 GNUはオプションlsを渡す必要があり--color=always、BSDの場合は常にカラーで出力するようにls環境をnull以外の値に設定する必要があります。CLICOLOR_FORCE

  2. <ESC>[1;31m色は、前景の太い赤のような文字シーケンスであるエスケープシーケンスを出力することによって得られます。幅は表示されませんが、関連してはcut最大7バイトまたは文字です$COLUMNS

    cutしたがって、計算では対応するエスケープシーケンスを無視する必要があるため、ここでは使用できません。代わりに、次のようにすることができます。

    esc=$'\e' # or esc=$(printf '\33') if your shell doesn't do $'...'
    CLICOLOR_FORCE=1 ls -l | sed "
      s/^\(\(\($esc\[[0-9;]*m\)*.\{0,1\}\)\{$COLUMNS\}\).*/\1${esc}[m/"
    

    そこで色が切り捨てられる場合に備えてsed数を計算し、1を追加して色をデフォルト値に戻します。\e[m

    cut現在のバージョンのGNU実装-cとは異なり、マルチバイト単一幅文字を処理しますが、-b幅0または幅2の文字、タブ、またはその他の制御文字は処理しません。

あるいは、改行なしで直接切り取るように端末に指示することもできます。

tput rmam

(リセットモード自動マージン、tput smamリカバリ用)

次の関数を定義できます。

nowrap() {
  [ -t 1 ] && tput rmam
  "$@"; local ret="$?"
  [ -t 1 ] && tput smam
  return "$ret"
}
alias nowrap='nowrap '

alias後でエイリアス拡張を強制する部分nowrap)は次のとおりです。

nowrap ls -l ...

答え2

man ls:

   --color[=WHEN]
          colorize  the  output;  WHEN  can be 'never', 'auto', or 'always' (the
          default); more info below

お使いのls設定は、おそらく--color=auto端末に直接接続されている場合にのみ色を出力するように設定されています。 (カットなどの他のコマンドの代わりに)

を使用できますが、--color=alwaysカラーアイテム全体は、色のオンとオフを切り替える特殊文字(エスケープシーケンス)を挿入して機能することに注意してください。塗りつぶされた単語の中央を切り取ると、「塗りつぶしを止める」順序が削除され、次の行にも塗りつぶしが適用されます。

たぶんls --color=always|less -RSそれはあなたが望むことをするでしょう。

答え3

カラーフォーマットが維持されるようにターミナルに出力を偽にするには、(FreeBSD)コマンド(または同様のもの)を使用して疑似ターミナルでls実行できます。scriptptymagic.c)。

script -q /dev/null ls -lG | tr -d '\r' | cut -c 1-$COLUMNS

ptymagic ls -lG | cut -c 1-$COLUMNS

答え4

less -RS私が考えることができる最も近いシンプルなソリューションです。有名なポケットベルはless色変更エスケープシーケンスを処理-Rし()、長い行を切り捨てるように求められます(-S)。

-Eファイルの最後で終了し、-F内容が画面に合ったらすぐに終了するなどのオプションもあります。

less開発者が希望する動作に対する機能要求を喜んで受け入れるかどうかを確認するのは興味深いでしょう。実際には目的には合いませんが、lessユーティリティは基本的に必要なすべてのブロックをすでに実装しており、機能要求をサポートするために拡張するのが最も簡単です。

関連情報