Câu trả lời:
Lệnh đầu tiên ở đây mô phỏng định dạng bạn nhìn thấy vim
. Nó mở rộng thông minh các tab thành số lượng không gian tương đương, dựa trên cài đặt tab-STOP (ts) của mỗi 4 cột.
printf "ab\tcd\tde\n" |expand -t4
Đầu ra
ab cd de
Để giữ các tab dưới dạng các tab và đặt các vị trí STOP của tab thành mỗi cột thứ 4, thì bạn phải thay đổi cách môi trường hoạt động với tab-char (giống như vim làm với :set ts=4
lệnh)
Ví dụ: trong thiết bị đầu cuối, bạn có thể đặt tab STOP thành 4 bằng lệnh này;
tabs 4; printf "ab\tcd\tde\n"
Đầu ra
ab cd de
Chỉ cần sử dụng mã sau đây:
tabs -n
Trong đó n là số lượng khoảng trắng bạn muốn các tab tương ứng. Để không phải thực hiện điều này mỗi khi bạn khởi động vỏ, chỉ cần chỉnh sửa của bạn .bash_profile
trong ~/
và thêm dòng trên vào cuối của tập tin.
Để biết thêm thông tin về lệnh tab, tham khảo:
man tabs
ls
hỏng các lệnh khác (ví dụ: đặt ngoài có thể trông không được căn chỉnh chính xác).
Không có khái niệm về các tab hoặc tab dừng trong cat
; chương trình chỉ đưa các đầu vào vào đầu ra và xử lý các tab như bất kỳ ký tự nào khác. Nếu thiết bị đầu ra tình cờ là một thiết bị đầu cuối, các tab sẽ được xử lý theo bất kỳ hành vi nào mà thiết bị đầu cuối được cấu hình để cung cấp.
Các hệ thống triển khai POSIX.1 có một lệnh được gọi tabs(1)
sẽ điều chỉnh khái niệm của thiết bị đầu cuối về cách hiển thị các tab. Tùy thuộc vào bố cục tab cụ thể không được coi là một ý tưởng hay, vì ai đó có thể gửi tệp của bạn đến một số thiết bị khác, chẳng hạn như máy in sẽ không làm những gì bạn dự định.
Khi bạn điều chỉnh ts
trong vim
(hoặc đồng bằng vi
), tất cả các bạn đang làm là điều chỉnh cách các nhân vật tab diễn giải editor khi hiển thị. Nó không có liên quan đến những gì kết thúc trong tập tin.
Dựa trên các câu trả lời và ví dụ trên, có vẻ như lệnh thực tế mà OP muốn là ...
cat somefile | expand -t4
Điều này làm việc cho tôi trên Red Hat 6.4.
Để mở rộng các câu trả lời đã cho, expand
cũng có thể lấy danh sách các vị trí dừng tab. Điều này rất hữu ích nếu độ dài nội dung của các cột khác nhau thay đổi rất nhiều.
Tôi đã vượt qua yêu cầu này ngày hôm nay khi tôi muốn làm cho đầu ra openssl ciphers
dễ đọc hơn:
$ 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
Chỉ sử dụng expand -t31
sẽ làm tăng chiều rộng của đầu ra từ khoảng 100 ký tự đến hơn 160 ký tự.
column
:openssl ciphers -v 'HIGH' | column -t
Nhiều thiết bị đầu cuối hỗ trợ thiết lập các tab biến dừng. Những điều đó là vt100, linux và hoặc hỗ trợ tiêu chuẩn EMCA-48, hầu hết các điều khoản về kích thước tab cài đặt hỗ trợ linux: xterm và gia đình (uxterm, urxvt) xfce4-terminal, luit, Terminal, SecureTTY, trong số các thuật ngữ khác.
Vì vậy, đã viết một kịch bản vài năm trước để đặt các tab của tôi khi đăng nhập vào mỗi 2 khoảng trắng - được sử dụng để sử dụng 4, sau đó 3 cho một chút và bây giờ là 2 ....
Vì vậy, bây giờ, nếu tôi 'cat' một tệp, các tab trong tệp sẽ mở rộng sang cài đặt của thiết bị đầu cuối của tôi.
Nếu tôi đã thông qua vim trở lên, họ sẽ tự mở rộng tab, nhưng rất nhiều dụng cụ sử dụng các tab.
Sẽ bao gồm tập lệnh ở đây để tham khảo và hoặc sử dụng cá nhân:
#!/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
Hy vọng nó giúp...
Theo trang web, con mèo không thể tự làm điều đó. Nhưng bạn có thể ví dụ chạy đầu ra từ cat thông qua tr
bộ lọc để thay thế các tab bằng bất kỳ số lượng khoảng trống nào bạn muốn:
cat somefile | tr '\t' ' '
sẽ thay thế ký tự tab bằng hai khoảng trắng.
Cập nhật: như đã chỉ ra trong các bình luận cho bài viết này, điều này thực sự không hoạt động. Tuy nhiên, tôi đang giữ câu trả lời là một ví dụ về cách không làm điều đó.
'\t'
chỉ bằng một khoảng trắng, bất kể có bao nhiêu khoảng trống ở giữa cặp dấu ngoặc kép thứ hai' '
tr
không hoạt động theo cách đó .. mỗi byte của arg 1 được thay thế bằng từng byte tương ứng của arg 2 ..... Do đó printf '\t' |tr '\t' 'ळ'
in ra một byte duy nhất có giá trị hex là \xE0
.. đó là byte đầu tiên trong ba UTF-8 byte được mã hóa tạo nên ký tự ळ
(có giá trị Unicode CodePoint là U + 0933)
expand
(từ gói coreutils) vàtabs
(từ gói ncurses), (2). và ý nghĩa của ts là [ T ] ab [ S ] hàng đầu