[unix] “cat”명령의 탭 크기 변경

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

:set ts=4

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



답변

여기서 첫 번째 명령 은에 표시 되는 형식을 에뮬레이트 합니다 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


답변

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

tabs -n

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

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

man tabs


답변

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

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

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


답변

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

cat somefile | expand -t4

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


답변

이미 주어진 답변을 확장하기 위해 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 자 이상으로 늘어납니다.


답변

많은 터미널이 변수 탭 정지 설정을 지원합니다. 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

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


답변

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

cat somefile | tr '\t' '  '

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

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