更改“ cat”命令的选项卡大小


15

当我进入时,vim可以使用以下命令更改选项卡的大小:

:set ts=4

是否也可以设置cat命令输出的制表符大小?

Answers:


21

这里的第一个命令模拟您在中看到的格式vim。它基于每4列的制表符停止(ts)设置,将制表符智能地扩展到相等的空格数。

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

输出量

ab  cd  de

为了保持标签标签和有标签STOP设置为每4列的位置,则必须改变方式,环境工程与制表字符(就像VIM确实与:set ts=4命令)

例如,在终端中,可以使用此命令将STOP选项卡设置为4;否则,可以将选项卡设置为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是您也希望制表符也要对应的空格数。为了不必每次启动Shell时都这样做,只需编辑.bash_profilein ~/并将上面的行添加到文件末尾即可。

有关tabs命令的更多信息,请参考:

man tabs

2
请注意,永久更改默认选项卡的宽度可能会弄乱其他命令(例如,ls输出可能看起来未正确对齐)。
Gustavo Bezerra 2014年

9

中没有制表符或制表符停止的概念cat;该程序只是将输入集中到输出中,并像其他任何字符一样对待制表符。如果输出设备恰好是终端,则将根据终端配置为提供的任何行为来处理选项卡。

实现POSIX.1的系统有一个名为的命令tabs(1),它将调整终端的应如何显示选项卡的概念。取决于特定的选项卡布局不是一个好主意,因为有人可能会将您的文件发送到其他设备(例如打印机),而这些设备将无法实现您的预​​期目的。

进行tsin vim(或plain vi)调整时,您所做的只是调整编辑器在显示时解释制表符的方式。它与文件中的最终内容无关。


感谢您的解释。打印机如何配置来处理标签?
Meysam'2

大多数打印机对它们的处理方式与大多数终端默认情况下相同:左页边距以及之后的每八个字符。
Blrfl 2012年

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

使用only expand -t31将使输出的宽度从大约100个字符增加到160个以上字符。


1
一种更简单的方法是使用columnopenssl ciphers -v 'HIGH' | column -t
muru

0

许多终端支持设置变量制表位。那些是vt100,linux或支持EMCA-48标准的软件,大多数情况下都支持设置标签大小:xterm和家族(uxterm,urxvt)xfce4-terminal,luit,Terminal,SecureTTY等。

所以几年前写了一个脚本来在登录时将我的标签设置为每2个空格-以前使用4,然后短时使用3,现在是2。

因此,现在,如果我“捕获”文件,则文件中的选项卡将扩展到终端的设置。

如果我通过vim或更多,他们会进行自己的标签扩展,但是很多utils会使用标签。

将在此处包含脚本以供参考和/或用于个人用途:

#!/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

根据联机帮助页,cat不能单独执行此操作。但是您可以例如通过tr过滤器运行cat的输出,以任意数量的空格替换选项卡:

cat somefile | tr '\t' '  '

将制表符替换为两个空格。

更新:正如在这篇文章的评论中指出的那样,这实际上行不通的。不过,我以答案为例来说明如何这样做。


3
实际上'\t',它仅替换为一个空格,无论第二对引号之间有多少空格' '
Meysam,2012年

3
tr不工作的方式..每个字节 ARG 1的由每个相应的取代的字节 ARG 2 .....因此printf '\t' |tr '\t' 'ळ' 打印出其十六进制值是单个字节\xE0..这是三个UTF-8的第一个字节组成字符的编码字节(其Unicode CodePoint值为U + 0933)
Peter.O 2012年

嗯当然了 感谢您发现我的愚蠢错误!
彼得·乌泽
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.