Pure Bash, tidak ada utilitas eksternal
Demonstrasi ini melakukan justifikasi penuh, tetapi Anda bisa menghilangkan pengurangan panjang string kedua jika Anda menginginkan garis yang tidak rata.
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
Sayangnya, dalam teknik itu, panjang string pad harus di-hardcode agar lebih panjang dari yang terpanjang yang Anda pikir Anda perlukan, tetapi padlength bisa menjadi variabel seperti yang ditunjukkan. Namun, Anda dapat mengganti baris pertama dengan ketiga baris ini agar dapat menggunakan variabel untuk panjang bantalan:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
Jadi pad ( padlimit
dan padlength
) bisa didasarkan pada lebar terminal ( $COLUMNS
) atau dihitung dari panjang string data terpanjang.
Keluaran:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
Tanpa mengurangi panjang senar kedua:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
Baris pertama malah bisa sama (mirip dengan sprintf
):
printf -v pad '%0.1s' "-"{1..60}
atau serupa untuk teknik yang lebih dinamis:
printf -v pad '%*s' "$padlimit"
Anda dapat melakukan pencetakan semua dalam satu baris jika Anda mau:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"
'%0.31s'
. String (argumen terakhir) dipotong sesuai panjang yang ditentukan setelah titik. Nol mencegah padding ruang apa pun menjadi keluaran. Jadi 31 tanda hubung adalah keluaran.padlength
untuk memilih panjang aktual ke keluaran.Bash Murni. Gunakan panjang nilai 'PROC_NAME' sebagai offset untuk string tetap 'line':
Ini memberi
sumber
PROC_NAME
memiliki spasi kecuali mereka sudah di-escape. Anda akan mendapatkan satu baris dengan masing-masing dua token dan kemudian [UP] untuk setiap dua token yang dipisahkan spasi dalam variabel Anda dan kemudian satu baris di akhir denganline
teks Anda dikurangi total panjang string input Anda. Jadi berhati-hatilah, karena ini dapat menyebabkan bug yang menarik dan berpotensi tidak aman jika dilakukan dalam skrip yang kompleks. Jika tidak pendek dan sederhana. :)Solusi sepele (tapi berhasil):
sumber
Saya rasa ini adalah solusi paling sederhana. Bawaan shell murni, tanpa matematika inline. Ini meminjam dari jawaban sebelumnya.
Hanya substring dan meta-variabel $ {# ...}.
Menghasilkan
Menghasilkan
sumber
Tidak ada cara untuk mengisi apapun kecuali menggunakan spasi
printf
. Anda dapat menggunakansed
:sumber
printf "%-50s@%s\n" ${PROC_NAME}@ [UP] | sed -e 's/ /-/g' -e 's/-@/ /' -e 's/@-/ /'
Penjelasan:
printf '\055%.0s' {1..40}
- Buat 40 tanda hubung( tanda hubung diartikan sebagai opsi jadi gunakan kode ascii yang lolos)
"$PROC_NAME ..."
- Gabungkan $ PROC_NAME dan tanda hubung| head -c 40
- Pangkas string menjadi 40 karakter pertamasumber
printf 'x' {1..40}
hanya mencetak satux
hmmmx
sprintf -- "-%.0s" {1..40}
Yang ini bahkan lebih sederhana dan tidak menjalankan perintah eksternal.
sumber
Sederhana tetapi berhasil:
Contoh penggunaan:
Output ke stdout:
sumber
echo
hanya menggunakanJawaban @Dennis Williamson berfungsi dengan baik kecuali saya mencoba melakukan ini menggunakan echo. Echo memungkinkan untuk mengeluarkan karakter dengan warna tertentu. Menggunakan printf akan menghapus pewarnaan itu dan mencetak karakter yang tidak dapat dibaca. Inilah
echo
alternatif-satunya:keluaran:
tentu saja Anda dapat menggunakan semua variasi yang diusulkan oleh @Dennis Williamson apakah Anda ingin bagian kanan rata kiri atau kanan (diganti
25 - ${#string1}
dengan25 - ${#string1} - ${#string2}
dll ...sumber
Ini satu lagi:
sumber
Jika Anda mengakhiri karakter pad pada beberapa nomor kolom tetap, maka Anda dapat menimpa dan
cut
memanjang:sumber
Simple Console Span / Fill / Pad / Padding dengan metode penskalaan / pengubahan ukuran otomatis dan Contoh.
Contoh:
create-console-spanner "loading graphics module" "[success]"
Sekarang di sini adalah suite-terminal-karakter-warna-fitur-fitur lengkap yang melakukan segalanya sehubungan dengan pencetakan warna dan gaya yang diformat string dengan kunci pas.
Untuk mencetak warna , itu cukup sederhana:
paint-format "&red;This is %s\n" red
Dan Anda mungkin ingin tampil berani nanti:paint-format "&bold;%s!\n" WOW
The
-l
pilihan untukpaint-format
fungsi mengukur teks sehingga Anda dapat melakukan operasi metrik huruf konsol.The
-v
pilihan untukpaint-format
fungsi bekerja sama denganprintf
tetapi tidak dapat diberikan dengan-l
Sekarang untuk spanning !
paint-span "hello " . " &blue;world"
[catatan: kami tidak menambahkan urutan terminal baris baru, tetapi teks mengisi terminal, jadi baris berikutnya hanya tampak seperti urutan terminal baris baru]dan outputnya adalah:
hello ............................. world
sumber
Bash + seq untuk memungkinkan perluasan parameter
Mirip dengan jawaban @Dennis Williamson, tetapi jika
seq
tersedia, panjang string pad tidak perlu di-hardcode. Kode berikut memungkinkan untuk melewatkan variabel ke skrip sebagai parameter posisi:Kode ASCII "2D" digunakan sebagai pengganti karakter "-" untuk menghindari shell menafsirkannya sebagai tanda perintah. Pilihan lainnya adalah "3D" untuk menggunakan "=".
Jika tidak ada padlength yang diteruskan sebagai argumen, kode di atas secara default menggunakan lebar terminal standar 80 karakter.
Untuk memanfaatkan variabel bash shell
COLUMNS
(yaitu, lebar terminal saat ini), variabel lingkungan harus tersedia untuk skrip. Salah satu caranya adalah dengan mengambil semua variabel lingkungan dengan menjalankan skrip yang diawali dengan.
(perintah "titik"), seperti ini:atau (lebih baik) secara eksplisit meneruskan
COLUMNS
variabel saat menjalankan, seperti ini:sumber