使用剪切保留颜色输出

ken*_*n_o 8 command-line ls shell colors pipe

以交互方式使用 bash 我试图使用 cut 来防止线条长于我的终端宽度。但是当使用带有彩色输出的命令时,所有颜色都会被剪切去除。例如: ls -lG | cut -c 1-$COLUMNS

无论如何要剪切以保留颜色格式?

Sté*_*las 8

你这里有两个问题

  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/"
    
    Run Code Online (Sandbox Code Playgroud)

    在那里,sed进行计数并添加一个\e[m以将颜色恢复为默认值,以防它在此过程中被切割。

或者,您可以告诉您的终端不要包装并使用以下方法自行切割:

tput rmam
Run Code Online (Sandbox Code Playgroud)

tput smam恢复)

您可以定义一个函数,如:

nowrap() {
  [ -t 1 ] && tput rmam
  "$@"; local ret="$?"
  [ -t 1 ] && tput smam
  return "$ret"
}
alias nowrap='nowrap '
Run Code Online (Sandbox Code Playgroud)

(在alias之后强制别名扩展的部分nowrap),称为:

nowrap ls -l ...
Run Code Online (Sandbox Code Playgroud)