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

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

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 ...

おすすめ記事