Shell

通過剪切保留顏色輸出

  • January 14, 2014

以互動方式使用 bash 我正在嘗試使用 cut 來防止線條長度超過我的終端寬度。但是當使用帶有彩色輸出的命令時,所有顏色都會被剪切刪除。例如: ls -lG | cut -c 1-$COLUMNS

無論如何要剪切以保留顏色格式?

你這裡有兩個問題

  1. ls -G當輸出沒有到達終端(這裡改為管道)時,停止彩色輸出。GNUls需要傳遞一個--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進行計數並添加 a\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 ...

引用自:https://unix.stackexchange.com/questions/109211