bashをインタラクティブに使用する私は、行が端末の幅よりも長くなるのを防ぐためにcutを使用しようとしています。ただし、カラー出力にコマンドを使用すると、すべてのカラーが切り捨てられ、削除されます。たとえば: ls -lG | cut -c 1-$COLUMNS
。
カラーフォーマットを切り取り保存する方法はありますか?
ベストアンサー1
ここに2つの質問があります。
ls -G
出力が端子(ここではパイプ)に達していない場合は、カラー出力を停止します。 GNUはオプションls
を渡す必要があり--color=always
、BSDの場合は常にカラーで出力するようにls
環境をnull以外の値に設定する必要があります。CLICOLOR_FORCE
<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 ...