web-dev-qa-db-ja.com

カットによるカラー出力の維持

Bashをインタラクティブに使用して、線が端末の幅より長くならないようにカットを使用しようとしています。ただし、色付きの出力でコマンドを使用すると、すべての色がカットによって削除されます。例えば: ls -lG | cut -c 1-$COLUMNS

カラーフォーマットを維持するためにカットする方法はありますか?

7
ken_o

ここには2つの問題があります

  1. ls -Gは、出力が端末(ここでは代わりにパイプ)に送信されない場合、カラーでの出力を停止します。 GNU lsには--color=alwaysオプションを渡す必要があり、BSD lsの場合は、環境CLICOLOR_FORCEをに設定する必要があります。常にカラーで出力するように指示する空でない値。
  2. 色は、前景の赤の<ESC>[31mのような文字のシーケンスであるエスケープシーケンスを出力することによって実現されます。表示時に幅はありませんが、cutに関する限り、これは5文字で、$COLUMNSまでカウントされます。

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

    esc=$'\e'
    CLICOLOR_FORCE=1 ls -l | sed "s/\(\(\($esc\[[0-9;]*m\)\{0,1\}.\{0,1\}\)\{$COLUMNS\}\).*/\1${esc}[m/"
    

    そこで、sedがカウントを行い、\e[mを追加して、プロセスでカットされた場合に備えて色をデフォルトに戻します。

または、端末にラップしないように指示して、次のコマンドで切断することもできます。

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

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はあなたが望むことをするでしょう。

2
michas

端末への出力を偽造して色の書式を保持するには、(FreeBSD)lsコマンド(または ptymagic.cなどのツール)を使用して疑似端末でscriptを実行できます。 )。

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

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