Відповіді:
Перша команда тут імітує форматування, яке ви бачите в 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
Просто використовуйте наступний код:
tabs -n
Де n - кількість пробілів, яким ви також повинні відповідати вкладкам. Для того , щоб не мати , щоб робити це кожен раз при запуску оболонки, просто редагувати свій .bash_profile
ін ~/
і додайте цей рядок в кінець файлу.
Для отримання додаткової інформації про команду вкладок див.
man tabs
ls
, розміщені на екрані можуть виглядати неправильно вирівняними).
Не існує поняття вкладок або зупинок вкладки cat
; програма просто виконує входи до виводу та обробляє вкладки, як і будь-який інший символ. Якщо пристроєм виведення трапляється термінал, вкладки будуть оброблятися залежно від поведінки, яку термінал налаштований надавати.
Системи, що реалізують POSIX.1, мають команду, tabs(1)
яка буде коригувати концепцію терміналу щодо відображення вкладок. Залежно від конкретної розкладки вкладки не вважається гарною ідеєю, оскільки хтось може надіслати ваш файл на якийсь інший пристрій, наприклад принтер, який не виконає те, що ви задумали.
Під час налаштування ts
в vim
(або просто vi
), всі , що ви робите, регулюючи як редактор інтерпретує символи табуляції при відображенні. Це не стосується того, що закінчується у файлі.
Виходячи з вищенаведених відповідей та прикладів, здавалося б, що фактична команда, яку хотів ОП, це ...
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 символів.
column
openssl ciphers -v 'HIGH' | column -t
Багато терміналів підтримують налаштування змінних вкладок. Ті, хто 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
Сподіваюся, це допомагає ...
За даними manpage, кішка не може це зробити самостійно. Але ви можете, наприклад, запустити вихід з кота через tr
фільтр, щоб замінити вкладки на будь-яку кількість пробілів:
cat somefile | tr '\t' ' '
замінить символ вкладки на два пробіли.
Оновлення: як зазначено в коментарях до цієї публікації, це насправді не працює. Тим не менш, я тримаю відповідь як приклад того, як цього не зробити.
'\t'
лише один пробіл, незалежно від того, скільки пробілів знаходиться між другою парою лапок' '
tr
не працює таким чином .. кожен байт arg 1 замінюється кожним відповідним байтом arg 2 ..... Тому printf '\t' |tr '\t' 'ळ'
виводиться один байт, шістнадцяткове значення \xE0
якого - це перший байт з трьох UTF-8 закодовані байти, які складають символ ळ
(значення якого для Unicode CodePoint - U + 0933)
expand
(з пакета coreutils) таtabs
(з пакету ncurses), (2). і значення ts є [ T ] ab [ S ] top