클리핑을 통해 색상 출력 보존

클리핑을 통해 색상 출력 보존

bash를 대화형으로 사용하기 나는 줄이 터미널 너비보다 길어지는 것을 방지하기 위해 cut을 사용하려고 합니다. 그러나 색상 출력에 명령을 사용하면 모든 색상이 잘리고 제거됩니다. 예를 들어: ls -lG | cut -c 1-$COLUMNS.

색상 형식을 잘라내고 보존할 수 있는 방법이 있습니까?

답변1

여기에 두 가지 질문이 있습니다.

  1. ls -G출력이 터미널(여기서는 파이프)에 도달하지 않으면 컬러 출력을 중지합니다. GNU는 옵션 ls을 전달해야 하며 --color=always, BSD의 경우 항상 컬러로 출력하도록 ls환경을 null이 아닌 값으로 설정해야 합니다 .CLICOLOR_FORCE

  2. <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터미널에 직접 연결될 때만 색상을 출력하도록 구성되어 있을 것입니다. (cut과 같은 다른 명령 대신)

를 사용할 수 있지만 --color=always전체 색상 항목은 색상을 켜고 끄는 특수 문자(이스케이프 시퀀스)를 삽입하여 작동한다는 점에 유의하세요. 색칠된 단어의 중간을 자르면 "색칠 중지" 순서가 제거되고 다음 줄에도 색칠이 적용됩니다.

어쩌면 ls --color=always|less -RS그것은 당신이 원하는 것을 할 것입니다.

답변3

색상 형식이 유지되도록 터미널로 출력을 가짜로 만들려면 (FreeBSD) 명령(또는 이와 유사한 것)을 사용하여 ls의사 터미널에서 실행할 수 있습니다.scriptptymagic.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유틸리티는 기본적으로 필요한 모든 블록을 이미 구현했으며 기능 요청을 지원하기 위해 확장하기가 가장 쉽습니다.

관련 정보