“Cat” komutunun sekme boyutunu değiştirme


15

İçindeyken vimsekme boyutunu aşağıdaki komutla değiştirebilirim:

:set ts=4

catKomut çıktısı için sekme boyutu da ayarlanabilir mi?

Yanıtlar:


21

Buradaki ilk komut gördüğünüz biçimlendirmeyi öykünürvim . Her 4 sütunun sekme-DURDUR (ts) ayarına dayalı olarak sekmeleri akıllıca eşdeğer sayıda boşluğa genişletir.

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

Çıktı

ab  cd  de

Tutmak için sekmeleri olarak sekmelerin ve sekme sahip DUR her 4. sütuna ayarlamak pozisyonları, o zaman biçimini değiştirmek gerekir sekme karakter ile çevre işleri (vim ile yaptığı gibi :set ts=4komuta)

Örneğin, terminalde bu komutla STOP sekmesini 4 olarak ayarlayabilirsiniz ;

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

Çıktı

ab  cd  de

bilmek güzel (1). expand(coreutils paketinden) ve tabs(ncurses paketinden) komutu, (2). ve ts anlamı [ T ] ab [ S ] top
LiuYan 刘 研

10

Sadece aşağıdaki kodu kullanın:

tabs -n

Burada n, sekmelerin de karşılık gelmesini istediğiniz boşluk sayısıdır. Eğer kabuk, sadece düzenleme için başlangıç bu her zaman yapmak zorunda değil amacıyla .bash_profilein ~/ve dosyanın sonuna yukarıdaki satırı ekleyin.

Tabs komutu hakkında daha fazla bilgi için, bkz:

man tabs

2
Varsayılan sekmelerinizin genişliğini kalıcı olarak değiştirmenin diğer komutları bozabileceğine dikkat edin (örneğin, lsçıktı koymak düzgün hizalanmamış görünebilir).
Gustavo Bezerra

9

İçinde sekme veya sekme durağı kavramı yoktur cat; program sadece girdileri çıktıya huniler ve sekmeleri diğer herhangi bir karakter gibi ele alır. Çıkış cihazı bir terminal haline gelirse, sekmeler terminalin sağlamak üzere yapılandırıldığı davranışa göre işlenir.

POSIX.1 uygulayan sistemlerde tabs(1), terminalin sekmelerin nasıl görüntülenmesi gerektiği kavramını ayarlayacak bir komut bulunur . Birisi dosyanızı istediğiniz gibi yapmayan bir yazıcı gibi başka bir cihaza gönderebileceğinden, belirli bir sekme düzenine bağlı olarak iyi bir fikir sayılmaz.

Ayarlamak zaman tsiçinde vim(veya düz vi), yaptığınızı tüm görüntülendiğinde nasıl editör yorumlayıp sekme karakterleri ayarlayarak olduğunu. Dosyada neyin bittiği konusunda hiçbir etkisi yoktur.


Açıklama için teşekkürler. Yazıcı sekmeleri tedavi etmek için nasıl yapılandırılır?
Meysam

Çoğu yazıcı, varsayılan olarak çoğu terminalin yaptığı gibi davranır: sol kenar boşluğu ve her sekiz karakterden sonra.
Blrfl

5

Yukarıdaki cevaplara ve örneklere dayanarak, OP'nin istediği gerçek komutun ...

cat somefile | expand -t4

Bu benim için Red Hat 6.4 üzerinde çalışıyor.


2

Zaten verilen cevapları genişletmek için, expandsekme durağı konumlarının bir listesini de alabilir. Bu, değişken sütunların içerik uzunlukları çok değişiyorsa yararlıdır.

Ben openssl ciphersdaha okunabilir hale getirmek istedim bugün bu gereksinimi geldi :

$ 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

Yalnızca kullanıldığında expand -t31çıktının genişliği yaklaşık 100 karakterden 160 karaktere kadar çıkabilir.


1
Bunu yapmanın daha kolay bir yolu columnopenssl ciphers -v 'HIGH' | column -t
şunları

0

Birçok terminal değişken sekme duraklarının ayarlanmasını destekler. Vt100, linux ve veya EMCA-48 standardını destekleyenler, çoğu linux destek ayarı sekme boyutu ile ilgilidir: xterm ve ailesi (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, diğerleri arasında.

Bu yüzden birkaç yıl önce her 2 alana girişte sekmelerimi ayarlamak için bir komut dosyası yazdım - kısa bir süre için 4, sonra 3'ü kullanmak için kullanılır ve şimdi 2'de ....

Şimdi, bir dosyayı 'kedi' edersem, dosyadaki sekmeler terminalimin ayarına genişleyecektir.

Eğer vim ya da daha fazlasından geçtiysem, kendi sekme genişletmelerini yaparlar, ancak bir çok araç sekmeleri kullanır.

Komut dosyasını referans olarak veya kişisel kullanım için buraya ekleyecektir:

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

Umarım yardımcı olur...


-2

Manpage'e göre, kedi kendi başına yapamaz. Ancak tr, sekmeleri istediğiniz sayıda boşlukla değiştirmek için örneğin kedi filtre aracılığıyla çalıştırabilirsiniz :

cat somefile | tr '\t' '  '

sekme karakterini iki boşlukla değiştirir.

Güncelleme: Bu yazının yorumlarında belirtildiği gibi, bu aslında çalışmıyor . Yine de, nasıl bir örnek olarak cevap tutuyorum değil bunu yapmak için.


3
Aslında '\t'ikinci bir çift tırnak arasında kaç boşluk olursa olsun, sadece bir boşlukla değiştiriliyor' '
Meysam

3
tr.. Her bu şekilde çalışmaz bayt arg 1 her biri, karşılık gelen ikame edilen bayt ..... arg 2 Bu nedenle printf '\t' |tr '\t' 'ळ' olan altıgen değeri tek bir bayt yazdırır \xE0üç UTF-8 ilk baytı olan .. karakteri oluşturan kodlanmış baytlar (Unicode CodePoint değeri U + 0933 olan)
Peter.O

Ah, elbette. Aptalca hatamı yakaladığınız için teşekkürler!
Petr Uzel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.