Answers:
只需使用以下代码:
tabs -n
其中n是您也希望制表符也要对应的空格数。为了不必每次启动Shell时都这样做,只需编辑.bash_profile
in ~/
并将上面的行添加到文件末尾即可。
有关tabs命令的更多信息,请参考:
man tabs
ls
输出可能看起来未正确对齐)。
中没有制表符或制表符停止的概念cat
;该程序只是将输入集中到输出中,并像其他任何字符一样对待制表符。如果输出设备恰好是终端,则将根据终端配置为提供的任何行为来处理选项卡。
实现POSIX.1的系统有一个名为的命令tabs(1)
,它将调整终端的应如何显示选项卡的概念。取决于特定的选项卡布局不是一个好主意,因为有人可能会将您的文件发送到其他设备(例如打印机),而这些设备将无法实现您的预期目的。
进行ts
in vim
(或plain vi
)调整时,您所做的只是调整编辑器在显示时解释制表符的方式。它与文件中的最终内容无关。
要扩展已经给出的答案,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
使用only expand -t31
将使输出的宽度从大约100个字符增加到160个以上字符。
column
:openssl ciphers -v 'HIGH' | column -t
许多终端支持设置变量制表位。那些是vt100,linux或支持EMCA-48标准的软件,大多数情况下都支持设置标签大小:xterm和家族(uxterm,urxvt)xfce4-terminal,luit,Terminal,SecureTTY等。
所以几年前写了一个脚本来在登录时将我的标签设置为每2个空格-以前使用4,然后短时使用3,现在是2。
因此,现在,如果我“捕获”文件,则文件中的选项卡将扩展到终端的设置。
如果我通过vim或更多,他们会进行自己的标签扩展,但是很多utils会使用标签。
将在此处包含脚本以供参考和/或用于个人用途:
#!/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
希望能帮助到你...
根据联机帮助页,cat不能单独执行此操作。但是您可以例如通过tr
过滤器运行cat的输出,以任意数量的空格替换选项卡:
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