Ответы:
Первая команда здесь эмулирует форматирование, которое вы видите в vim
. Он интеллектуально расширяет вкладки до эквивалентного количества пробелов, основываясь на параметре tab-STOP (ts) каждых 4 столбцов.
printf "ab\tcd\tde\n" |expand -t4
Выход
ab cd de
Чтобы сохранить вкладки в закладках и имеет вкладку ОСТАНОВКУ позиции , установленную для каждого 4 - я колонка, то вы должны изменить способ среды работа с вкладкой-гольцом (так же , как ВЬЕТ делает с :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 и семейство (uxterm, urxvt), xfce4-терминал, 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, кошка не может сделать это самостоятельно. Но вы можете, например, запустить вывод команды cat через tr
фильтр, чтобы заменить вкладки на любое количество пробелов:
cat somefile | tr '\t' ' '
заменит символ табуляции двумя пробелами.
Обновление: как указано в комментариях к этому сообщению, это на самом деле не работает. Тем не менее, я держу ответ как пример того, как этого не делать.
'\t'
только одним пробелом, независимо от того, сколько пробелов находится между второй парой цитат' '
tr
не работает таким образом ... каждый байт аргумента 1 заменяется на каждый соответствующий байт аргумента 2 ..... Поэтому printf '\t' |tr '\t' 'ळ'
выводится один байт, шестнадцатеричное значение которого \xE0
... которое является первым байтом из трех UTF-8 закодированные байты, составляющие символ ळ
(значение Unicode CodePoint которого равно U + 0933)
expand
(из пакета coreutils) иtabs
(из пакета ncurses), (2). и значение ts - [ T ] ab [ S ] top