Respuestas:
El primer comando aquí emula el formato que ve en vim
. Expande de manera inteligente las pestañas al número equivalente de espacios, en función de una configuración de tabulación (STOP) de cada 4 columnas.
printf "ab\tcd\tde\n" |expand -t4
Salida
ab cd de
Para mantener las pestañas como pestañas y tener las posiciones de DETENCIÓN de pestañas establecidas en cada cuarta columna, debe cambiar la forma en que el entorno funciona con un tab-char (tal como lo hace vim con el :set ts=4
comando)
Por ejemplo, en el terminal, puede establecer la pestaña STOP en 4 con este comando;
tabs 4; printf "ab\tcd\tde\n"
Salida
ab cd de
Solo usa el siguiente código:
tabs -n
Donde n es el número de espacios que desea que las pestañas correspondan también. Con el fin de no tener que hacer esto cada vez que se inicia el shell, simplemente editar su .bash_profile
en ~/
y añadir la línea anterior al final del archivo.
Para obtener más información sobre el comando de pestañas, consulte:
man tabs
ls
out puede parecer que no está alineado correctamente).
No hay noción de pestañas o tabulaciones cat
; el programa simplemente canaliza las entradas a la salida y trata las pestañas como cualquier otro personaje. Si el dispositivo de salida es un terminal, las pestañas se manejarán de acuerdo con el comportamiento que el terminal esté configurado para proporcionar.
Los sistemas que implementan POSIX.1 tienen un comando llamado tabs(1)
que ajustará el concepto del terminal de cómo se deben mostrar las pestañas. Dependiendo de un diseño de pestaña en particular, no se considera una buena idea, ya que alguien puede enviar su archivo a otro dispositivo como una impresora que no hará lo que usted pretendía.
Cuando ajuste ts
en vim
(o simple vi
), todo lo que está haciendo es regular cómo el editor interpreta los caracteres de tabulación cuando se muestre. No tiene relación con lo que termina en el archivo.
Basado en las respuestas y ejemplos anteriores, parece que el comando real que el OP quería es ...
cat somefile | expand -t4
Esto funciona para mí en Red Hat 6.4.
Para ampliar las respuestas ya dadas, expand
también puede tomar una lista de posiciones de tabulación. Esto es útil si la longitud del contenido de las diversas columnas varía mucho.
Encontré este requisito hoy cuando quería hacer que la salida fuera openssl ciphers
más legible:
$ 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 solo expand -t31
aumentaría el ancho de la salida de alrededor de 100 caracteres a más de 160 caracteres.
column
:openssl ciphers -v 'HIGH' | column -t
Muchas terminales admiten la configuración de tabulaciones variables. Los que son vt100, linux y / o son compatibles con el estándar EMCA-48 sí, la mayoría de los términos en el tamaño de la pestaña de configuración de soporte de linux: xterm y family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, entre otros.
Así que escribí una secuencia de comandos hace unos años para configurar mis pestañas al iniciar sesión en cada 2 espacios: solía usar 4, luego 3 por un momento, y ahora en 2 ...
Entonces, si 'gato' un archivo, las pestañas en el archivo se expandirán a la configuración de mi terminal.
Si pasé por vim o más, hacen su propia expansión de pestañas, pero muchas utilidades usan pestañas.
Incluirá el script aquí para referencia, y / o uso personal:
#!/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 eso ayude...
Según la página de manual, cat no puede hacerlo solo. Pero puede, por ejemplo, ejecutar la salida de cat a través del tr
filtro para reemplazar las pestañas con cualquier cantidad de espacios que desee:
cat somefile | tr '\t' ' '
reemplazará el carácter de tabulación con dos espacios.
Actualización: como se señaló en los comentarios a esta publicación, esto en realidad no funciona. Sin embargo, mantengo la respuesta como un ejemplo de cómo no hacerlo.
'\t'
con un solo espacio, sin importar cuántos espacios haya entre el segundo par de citas' '
tr
no funciona de esa manera ... cada byte de arg 1 se sustituye por cada byte correspondiente de arg 2 ..... Por lo tanto, printf '\t' |tr '\t' 'ळ'
imprime un solo byte cuyo valor hexadecimal es \xE0
... que es el primer byte de los tres UTF-8 bytes codificados que forman el carácter ळ
(cuyo valor Unicode CodePoint es U + 0933)
expand
(desde el paquete coreutils) y eltabs
comando (desde el paquete ncurses), (2). y el significado de ts es [ T ] ab [ S ] top