Змініть розмір вкладки команди «cat»


15

Коли я перебуваю, vimя можу змінити розмір вкладки за допомогою наступної команди:

:set ts=4

Чи можна встановити розмір вкладки і для catвиведення команди?

Відповіді:


21

Перша команда тут імітує форматування, яке ви бачите в vim. Він інтелектуально розширює вкладки на еквівалентну кількість пробілів, спираючись на налаштування вкладки STOP (ts) кожні 4 стовпці.

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

Вихідні дані

ab  cd  de

Щоб зберегти вкладки як вкладки та встановити позиції вкладки STOP для кожного четвертого стовпця, ви повинні змінити спосіб роботи середовища з таблицею char (так само, як це робить vim з :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_profileін ~/і додайте цей рядок в кінець файлу.

Для отримання додаткової інформації про команду вкладок див.

man tabs

2
Будьте обережні, що постійно змінена ширина вкладок за замовчуванням може накрутити інші команди (наприклад ls, розміщені на екрані можуть виглядати неправильно вирівняними).
Густаво Безерра

9

Не існує поняття вкладок або зупинок вкладки cat; програма просто виконує входи до виводу та обробляє вкладки, як і будь-який інший символ. Якщо пристроєм виведення трапляється термінал, вкладки будуть оброблятися залежно від поведінки, яку термінал налаштований надавати.

Системи, що реалізують POSIX.1, мають команду, tabs(1)яка буде коригувати концепцію терміналу щодо відображення вкладок. Залежно від конкретної розкладки вкладки не вважається гарною ідеєю, оскільки хтось може надіслати ваш файл на якийсь інший пристрій, наприклад принтер, який не виконає те, що ви задумали.

Під час налаштування tsв vim(або просто vi), всі , що ви робите, регулюючи як редактор інтерпретує символи табуляції при відображенні. Це не стосується того, що закінчується у файлі.


Дякую за пояснення. Як налаштований принтер для обробки вкладок?
Мейсам

Більшість принтерів трактують їх так само, як і більшість терміналів за замовчуванням: лівий край та кожні вісім символів.
Blrfl

5

Виходячи з вищенаведених відповідей та прикладів, здавалося б, що фактична команда, яку хотів ОП, це ...

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
columnopenssl ciphers -v 'HIGH' | column -t
Простіший

0

Багато терміналів підтримують налаштування змінних вкладок. Ті, хто vt100, linux та або підтримують стандарт EMCA-48, роблять більшість термінів на розмірі вкладки налаштування підтримки Linux: xterm та family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, серед інших.

Тому написав сценарій кілька років тому, щоб встановити мої вкладки при вході в кожні 2 пробіли - раніше використовувався 4, потім 3 короткий шматочок, а тепер у 2….

Тому зараз, якщо я 'кот' файл, вкладки у файлі розширяться до налаштувань мого терміналу.

Якщо я потрапив через 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

За даними manpage, кішка не може це зробити самостійно. Але ви можете, наприклад, запустити вихід з кота через trфільтр, щоб замінити вкладки на будь-яку кількість пробілів:

cat somefile | tr '\t' '  '

замінить символ вкладки на два пробіли.

Оновлення: як зазначено в коментарях до цієї публікації, це насправді не працює. Тим не менш, я тримаю відповідь як приклад того, як цього не зробити.


3
Він фактично замінює '\t'лише один пробіл, незалежно від того, скільки пробілів знаходиться між другою парою лапок' '
Мейсам

3
trне працює таким чином .. кожен байт arg 1 замінюється кожним відповідним байтом arg 2 ..... Тому printf '\t' |tr '\t' 'ळ' виводиться один байт, шістнадцяткове значення \xE0якого - це перший байт з трьох UTF-8 закодовані байти, які складають символ (значення якого для Unicode CodePoint - U + 0933)
Peter.O

Ах, звичайно. Дякуємо, що зловили мою дурну помилку!
Петро Узель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.