“cat”명령의 탭 크기 변경


15

내가있을 때 vim다음 명령으로 탭 크기를 변경할 수 있습니다.

:set ts=4

cat명령 출력에 대해서도 탭 크기를 설정할 수 있습니까?

답변:


21

여기서 첫 번째 명령 은에 표시 되는 형식을 에뮬레이트 합니다 vim. 4 열마다 탭 정지 (ts) 설정에 따라 탭을 동일한 수의 공간으로 지능적으로 확장합니다.

printf "ab\tcd\tde\n" |expand -t4   

산출

ab  cd  de

유지하려면 으로 과 탭이 STOP의 모든 4 열 설정 위치를, 당신은 방법을 변경해야합니다 탭으로 문자와 환경 작업 (정력이 함께 수행하는 것처럼 :set ts=4명령)

예를 들어, 터미널 에서이 명령으로 STOP 탭 을 4로 설정할 수 있습니다 .

tabs 4; printf "ab\tcd\tde\n" 

산출

ab  cd  de

알아두면 좋은 점 (1). expand(coreutils 패키지에서) 및 tabs(ncurses 패키지에서) 명령, (2). 그리고 ts의 의미는 [ T ] ab [ S ] top
LiuYan 刘 研

10

다음 코드를 사용하십시오.

tabs -n

여기서 n은 탭에 해당하는 공백 수입니다. 쉘을 시작할 때마다이 작업을 수행하지 않으려면 .bash_profilein을 편집 ~/하고 위의 행을 파일 끝에 추가하십시오.

tabs 명령에 대한 자세한 내용은 다음을 참조하십시오.

man tabs

2
기본 탭 너비를 영구적으로 변경하면 다른 명령이 손상 될 수 있습니다 (예 : ls출력이 올바르게 정렬되지 않은 것처럼 보일 수 있음).
구스타보 베 제라

9

탭 또는 탭 중지에 대한 개념은 없습니다 cat. 이 프로그램은 입력을 출력으로 옮기고 탭을 다른 문자처럼 취급합니다. 출력 장치가 터미널 인 경우 터미널이 제공하도록 구성된 동작에 따라 탭이 처리됩니다.

POSIX.1을 구현하는 시스템에는 tabs(1)탭 표시 방법에 대한 터미널의 개념을 조정 하는 명령 이 있습니다. 특정 탭 레이아웃에 따라 누군가 의도하지 않은 프린터와 같은 다른 장치로 파일을 보낼 수 있으므로 좋은 생각으로 간주되지 않습니다.

당신이 조정하는 경우 tsvim(또는 일반 vi), 당신이하고있는 모두가 표시 될 때 어떻게 편집기 해석 탭 문자를 조정합니다. 파일에서 끝나는 내용과 관련이 없습니다.


설명해 주셔서 감사합니다. 프린터는 탭을 처리하도록 어떻게 구성되어 있습니까?
Meysam

대부분의 프린터는 기본적으로 대부분의 터미널과 동일한 방식으로 처리합니다 (왼쪽 여백 및 이후 8 자마다).
Blrfl

5

위의 답변과 예를 바탕으로 OP가 원하는 실제 명령은 다음과 같습니다.

cat somefile | expand -t4

이것은 Red Hat 6.4에서 작동합니다.


2

이미 주어진 답변을 확장하기 위해 expand탭 정지 위치 목록을 가져올 수도 있습니다. 다양한 열의 내용 길이가 많이 변하는 경우에 유용합니다.

출력을 openssl ciphers더 읽기 쉽게 만들고 싶을 때 오늘이 요구 사항을 극복했습니다 .

$ openssl ciphers -v 'HIGH'|tr -s ' ' '\t'|expand -t31,41,57,70,90
ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2   Kx=ECDH         Au=RSA       Enc=AESGCM(256)     Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2   Kx=ECDH         Au=ECDSA     Enc=AESGCM(256)     Mac=AEAD
ECDHE-RSA-AES256-SHA384        TLSv1.2   Kx=ECDH         Au=RSA       Enc=AES(256)        Mac=SHA384
ECDHE-ECDSA-AES256-SHA384      TLSv1.2   Kx=ECDH         Au=ECDSA     Enc=AES(256)        Mac=SHA384
...
ECDH-ECDSA-AES128-SHA          SSLv3     Kx=ECDH/ECDSA   Au=ECDH      Enc=AES(128)        Mac=SHA1
AES128-GCM-SHA256              TLSv1.2   Kx=RSA          Au=RSA       Enc=AESGCM(128)     Mac=AEAD
AES128-SHA256                  TLSv1.2   Kx=RSA          Au=RSA       Enc=AES(128)        Mac=SHA256
AES128-SHA                     SSLv3     Kx=RSA          Au=RSA       Enc=AES(128)        Mac=SHA1

CAMELLIA128-SHA                SSLv3     Kx=RSA          Au=RSA       Enc=Camellia(128)   Mac=SHA1
PSK-AES128-CBC-SHA             SSLv3     Kx=PSK          Au=PSK       Enc=AES(128)        Mac=SHA1

을 사용 expand -t31하면 출력 너비가 약 100 자에서 160 자 이상으로 늘어납니다.


1
더 쉬운 방법은 다음을 사용하는 것입니다 column.openssl ciphers -v 'HIGH' | column -t
muru

0

많은 터미널이 변수 탭 정지 설정을 지원합니다. vt100, Linux 및 / 또는 EMCA-48 표준을 지원하는 것들은 리눅스 지원 설정 탭 크기에 관한 대부분의 용어입니다 : xterm 및 family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY 등.

그래서 몇 년 전에 스크립트를 작성하여 로그인시 탭을 2 칸마다 설정했습니다 .4, 3을 짧게 사용하고 지금은 2를 사용했습니다 ....

이제 파일을 'cat'하면 파일의 탭이 터미널 설정으로 확장됩니다.

vim 이상을 통과하면 자체 탭 확장을 수행하지만 많은 유틸리티가 탭을 사용합니다.

참고 용으로 여기에 스크립트를 포함 시키거나 개인적인 용도로 사용하십시오 :

#!/bin/bash  -u
#console_codes(4) man page... vt100/2 et && EMCA-48 standard
# (c) la walsh (2013) -- free to use and modify for personal use.
#                     -- optionally licenced under Gnu v3 license.

# v0.0.3    - try to reduce tabcols to minimal set to reproduce.
# v0.0.2    - set tabs for full terminal width (try to get term width)

shopt -s expand_aliases extglob
alias my=declare        
alias int='my -i'       array='my -a' intArray='my -ia'   string=my

my _Pt=$(type -t P)
[[ $_Pt && $_Pt == function ]] && unset -f P
alias P=printf
unset _Pt

P -v clrallts  "\x1b[3g"    #Clear All TabStops
P -v hts       "\033H"      #Horizontal TabStop
P -v cpr       "\x1b[6n"    #Current Position Report


getcols() {                 # try to read terminal width
  local sttyout="$(stty size </dev/tty)"
  int default_cols=80
  if [[ -n ${COLUMNS:-""} && $COLUMNS =~ ^[0-9]+$ ]]; then 
    default_cols=$COLUMNS; fi
  [[ -z ${sttyout:-""} ]] && { echo $default_cols; return 0; } 
  int cols="${sttyout#*\ }"
  echo -n $[cols<2?default_cols:cols]
  return 0
}

getpos () {
  string ans    wanted=${1:-xy}
  int attempt=0 max_attempt=1   # in case of rare failure case
                                # use 'attempt' value as additional
                                # time to wait for response
  while : ; do
    ( ( P "\x1b[6n" >/dev/tty) & 2>/dev/null )  
    read  -sd R -r -t $[2 + attempt] ans </dev/tty; 
    ans=${ans:2}; 
    int x=0-1 y=0-1
    if ! x="${ans#*;}" y="${ans%;*}" 2>/dev/null  || 
      ((x==-1||y==-1)); then
      ((attempt+=1 < max_attempt)) && continue
    fi
  break; done
  string out=""
  [[ $wanted =~ x ]] && out="$x"
  [[ $wanted =~ y ]] && out="${out:+$x }$y"
  [[ $out ]] && echo -n "$out"
}

declare -ia tabs


get_tabs () {
  P "\r"
  tabs=()
  int pos=0 oldpos=0-1
  while ((oldpos!=pos));do
    ((pos)) && tabs+=($pos)
    oldpos=pos
    P "\t"
    pos=$(getpos x)
  done
  P "\r"
  return 0
}

# Note: this func uses ability to _read_ tabstops as _proxy_ for setting them
# (i.e. it makes no sense to be able to read them if you can't set them)

test_tabset_ability () {
  string prompt="tty_tab:"
  int newcol=${#prompt}+1
  P "\r$prompt"
  int mycol=$(getpos x)
  ((mycol && mycol==newcol)) && return 0    ## return OK

  { P " Term tabset ability not detected mycol=${mycol:-''},"
    P " promptlen=$newcol)\n"; } >&2
  exit -1 
}

do_help_n_display_curtabs () {
  P " <n>   - set tab stop to N\r"
  intArray diffs;
  int last=1  cur i
  string eol=""
  get_tabs && {
    for ((i=0; i<${#tabs[@]}; ++i)); do
      cur=${tabs[i]}
      diffs[i]=cur-last
      last=cur
    done
    intArray reverse_tabs_set=()
    int prevtab=0-1
    for ((i=${#diffs[@]}-2; i>0; --i)); do
      int thistab=${diffs[i]}
      if ((thistab!= prevtab)) ;then 
        reverse_tabs_set+=($thistab)
        prevtab=thistab
      fi
    done
    P "current value: tty_tab "
      for ((i=${#reverse_tabs_set[@]}-1; i>=0; --i)); do
        P "%d " "${reverse_tabs_set[i]}"; done
    P "\r";
  }
  get_tabs  && {
    P "(from 1, tabs skip to column: "
    P "%s " "${tabs[@]}"
    P "\r\n"
  }
}

set_tabs () {
  int max_col=${1:=0-80}
  int tabstop=${2:-?"need a param for tabstop"}
  int tab=$tabstop        pos=0
  string str=""
  P $clrallts               ## reset old tabs
  while ((++pos<cols)) ;do  ## move across screen setting tabs
    str+=" "
    ((pos%tab)) || str+="$hts"
  done
  P "\r$str\r"
}


int cols=$(getcols)

test_tabset_ability         ## exits if no ability


if (($#==0)) ; then
  do_help_n_display_curtabs
  exit 1
else
  set_tabs "$cols" "$@"
fi

# vim: ts=2 sw=2

그것이 도움이되기를 바랍니다 ...


-2

맨 페이지에 따르면, 고양이는 스스로 할 수 없습니다. 그러나 예를 들어 tr필터를 통해 cat의 출력을 실행하여 탭을 원하는 수의 공백으로 바꿀 수 있습니다.

cat somefile | tr '\t' '  '

탭 문자를 두 개의 공백으로 바꿉니다.

업데이트 :이 게시물의 의견에서 지적했듯이 실제로 작동 하지 않습니다 . 그럼에도 불구하고, 나는 그것을 하지 않는 방법의 예로써 대답을 유지하고 있습니다.


3
'\t'두 번째 인용 부호 사이에 얼마나 많은 공백이 있더라도 실제로는 하나의 공백으로 만 대체 됩니다' '
Meysam

3
tr그런 식으로 작동하지 않습니다. arg 1의 각 바이트 는 arg 2의 해당하는 각 바이트 로 대체됩니다 . 따라서 16 진 값이 .. 인 단일 바이트를 인쇄합니다 . 이것은 3 개의 UTF-8의 첫 번째 바이트입니다. 문자를 구성하는 인코딩 된 바이트 (유니 코드 CodePoint 값은 U + 0933 임)printf '\t' |tr '\t' 'ळ'\xE0
Peter.O

아 물론 이죠 바보 같은 실수를 잡아 줘서 고마워!
Petr Uzel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.