Pure Bash, không có tiện ích bên ngoài
Trình diễn này giải thích đầy đủ, nhưng bạn chỉ có thể bỏ trừ độ dài của chuỗi thứ hai nếu bạn muốn các dòng lệch-phải.
pad=$(printf '%0.1s' "-"{1..60})
padlength=40
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
Thật không may, trong kỹ thuật đó, độ dài của chuỗi pad phải được mã hóa cứng để dài hơn chuỗi dài nhất mà bạn nghĩ bạn sẽ cần, nhưng độ dài của padlength có thể là một biến như hình minh họa. Tuy nhiên, bạn có thể thay thế dòng đầu tiên bằng ba dòng này để có thể sử dụng một biến cho độ dài của pad:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Vì vậy, pad ( padlimit
và padlength
) có thể dựa trên chiều rộng đầu cuối ( $COLUMNS
) hoặc được tính toán từ độ dài của chuỗi dữ liệu dài nhất.
Đầu ra:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Không trừ độ dài của chuỗi thứ hai:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Dòng đầu tiên có thể là dòng tương đương (tương tự như sprintf
):
printf -v pad '%0.1s' "-"{1..60}
hoặc tương tự cho kỹ thuật năng động hơn:
printf -v pad '%*s' "$padlimit"
Bạn có thể in tất cả trên một dòng nếu muốn:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"