Respostas:
O primeiro comando aqui emula a formatação que ver na vim
. Expande inteligentemente as guias para o número equivalente de espaços, com base em uma configuração de tabulação-STOP (ts) de cada 4 colunas.
printf "ab\tcd\tde\n" |expand -t4
Resultado
ab cd de
Para manter as guias como guias e ter as posições STOP da guia definidas para cada quarta coluna, você deve alterar a maneira como o ambiente funciona com um caractere de tabulação (assim como o vim faz com o :set ts=4
comando)
Por exemplo, no terminal, você pode definir a guia STOP como 4 com este comando;
tabs 4; printf "ab\tcd\tde\n"
Resultado
ab cd de
Basta usar o seguinte código:
tabs -n
Onde n é o número de espaços que você deseja que as guias correspondam também. Para não precisar fazer isso toda vez que você inicia o shell, basta editar o seu .bash_profile
in ~/
e adicionar a linha acima ao final do arquivo.
Para mais informações sobre o comando tabs, consulte:
man tabs
ls
, colocar fora de casa pode não estar alinhado corretamente).
Não há noção de abas ou paradas de abas cat
; o programa apenas canaliza as entradas para a saída e trata as guias como qualquer outro caractere. Se o dispositivo de saída for um terminal, as guias serão tratadas de acordo com o comportamento que o terminal estiver configurado para fornecer.
Os sistemas que implementam o POSIX.1 têm um comando chamado tabs(1)
que ajustará o conceito do terminal de como as guias devem ser exibidas. Dependendo de um layout de guia específico, não é considerada uma boa idéia, pois alguém pode enviar seu arquivo para outro dispositivo, como uma impressora que não fará o que você deseja.
Quando ajustar ts
em vim
(ou simples vi
), tudo o que você está fazendo é ajustar como as interpreta editor de caracteres de tabulação quando exibido. Não tem influência sobre o que acaba no arquivo.
Com base nas respostas e exemplos acima, parece que o comando real que o OP queria é ...
cat somefile | expand -t4
Isso funciona para mim no Red Hat 6.4.
Para expandir as respostas já fornecidas, expand
também é possível fazer uma lista de posições de tabulação. Isso é útil se o comprimento do conteúdo das diversas colunas variar muito.
Encontrei esse requisito hoje, quando queria tornar a saída openssl ciphers
mais legível:
$ 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
Usar apenas expand -t31
aumentaria a largura da saída de cerca de 100 caracteres para mais de 160 caracteres.
column
:openssl ciphers -v 'HIGH' | column -t
Muitos terminais suportam a configuração de paradas de tabulação variáveis. Aqueles que são vt100, linux e ou suportam o padrão EMCA-48, a maioria dos termos sobre linux suporta o tamanho da guia de configuração: xterm e family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, entre outros.
Então, escrevi um script alguns anos atrás para definir minhas guias no login para cada 2 espaços - costumava usar 4, depois 3 por um curto período, e agora em 2 ....
Portanto, agora, se eu 'gato' um arquivo, as guias do arquivo serão expandidas para a configuração do meu terminal.
Se eu passei pelo vim ou mais, eles fazem sua própria expansão de guias, mas muitos utilitários usam guias.
Incluirá o script aqui para referência e / ou uso pessoal:
#!/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
Espero que ajude...
De acordo com a página de manual, o gato não pode fazer isso sozinho. Mas você pode, por exemplo, executar a saída do gato através do tr
filtro para substituir as guias com qualquer número de espaços que desejar:
cat somefile | tr '\t' ' '
substituirá o caractere de tabulação por dois espaços.
Atualização: como apontado nos comentários deste post, isso realmente não funciona. No entanto, estou mantendo a resposta como um exemplo de como não fazê-lo.
'\t'
por apenas um espaço, não importa quantos espaços existam entre o segundo par de aspas # ' '
tr
não funciona dessa maneira .. cada byte de arg 1 é substituído por cada byte correspondente de arg 2 ..... Portanto, printf '\t' |tr '\t' 'ळ'
imprime um único byte cujo valor hexadecimal é \xE0
.. que é o primeiro byte dos três UTF-8 bytes codificados que compõem o personagem ळ
(cujo valor Unicode CodePoint é U + 0933)
expand
(do pacote coreutils) etabs
(do pacote ncurses), (2). e o significado de ts é [ T ] ab [ S ] top #