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 ...
答え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
実行できます。script
ptymagic.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
ユーティリティは基本的に必要なすべてのブロックをすでに実装しており、機能要求をサポートするために拡張するのが最も簡単です。