답변:
여기서 첫 번째 명령 은에 표시 되는 형식을 에뮬레이트 합니다 vim
. 4 열마다 탭 정지 (ts) 설정에 따라 탭을 동일한 수의 공간으로 지능적으로 확장합니다.
printf "ab\tcd\tde\n" |expand -t4
산출
ab cd de
유지하려면 탭 으로 탭 과 탭이 STOP의 모든 4 열 설정 위치를, 당신은 방법을 변경해야합니다 탭으로 문자와 환경 작업 (정력이 함께 수행하는 것처럼 :set ts=4
명령)
예를 들어, 터미널 에서이 명령으로 STOP 탭 을 4로 설정할 수 있습니다 .
tabs 4; printf "ab\tcd\tde\n"
산출
ab cd de
탭 또는 탭 중지에 대한 개념은 없습니다 cat
. 이 프로그램은 입력을 출력으로 옮기고 탭을 다른 문자처럼 취급합니다. 출력 장치가 터미널 인 경우 터미널이 제공하도록 구성된 동작에 따라 탭이 처리됩니다.
POSIX.1을 구현하는 시스템에는 tabs(1)
탭 표시 방법에 대한 터미널의 개념을 조정 하는 명령 이 있습니다. 특정 탭 레이아웃에 따라 누군가 의도하지 않은 프린터와 같은 다른 장치로 파일을 보낼 수 있으므로 좋은 생각으로 간주되지 않습니다.
당신이 조정하는 경우 ts
에 vim
(또는 일반 vi
), 당신이하고있는 모두가 표시 될 때 어떻게 편집기 해석 탭 문자를 조정합니다. 파일에서 끝나는 내용과 관련이 없습니다.
위의 답변과 예를 바탕으로 OP가 원하는 실제 명령은 다음과 같습니다.
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 표준을 지원하는 것들은 리눅스 지원 설정 탭 크기에 관한 대부분의 용어입니다 : xterm 및 family (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY 등.
그래서 몇 년 전에 스크립트를 작성하여 로그인시 탭을 2 칸마다 설정했습니다 .4, 3을 짧게 사용하고 지금은 2를 사용했습니다 ....
이제 파일을 'cat'하면 파일의 탭이 터미널 설정으로 확장됩니다.
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
그것이 도움이되기를 바랍니다 ...
맨 페이지에 따르면, 고양이는 스스로 할 수 없습니다. 그러나 예를 들어 tr
필터를 통해 cat의 출력을 실행하여 탭을 원하는 수의 공백으로 바꿀 수 있습니다.
cat somefile | tr '\t' ' '
탭 문자를 두 개의 공백으로 바꿉니다.
업데이트 :이 게시물의 의견에서 지적했듯이 실제로 는 작동 하지 않습니다 . 그럼에도 불구하고, 나는 그것을 하지 않는 방법의 예로써 대답을 유지하고 있습니다.
'\t'
두 번째 인용 부호 사이에 얼마나 많은 공백이 있더라도 실제로는 하나의 공백으로 만 대체 됩니다' '
tr
그런 식으로 작동하지 않습니다. arg 1의 각 바이트 는 arg 2의 해당하는 각 바이트 로 대체됩니다 . 따라서 16 진 값이 .. 인 단일 바이트를 인쇄합니다 . 이것은 3 개의 UTF-8의 첫 번째 바이트입니다. 문자를 구성하는 인코딩 된 바이트 (유니 코드 CodePoint 값은 U + 0933 임)printf '\t' |tr '\t' 'ळ'
\xE0
ळ
expand
(coreutils 패키지에서) 및tabs
(ncurses 패키지에서) 명령, (2). 그리고 ts의 의미는 [ T ] ab [ S ] top