Shell-Script
將文本居中對齊,兩邊都有填充
有沒有一種簡單的方法可以將文本與兩側的填充對齊,列寬是輸入中最長的行?
例如,這個:
aaa bbbb c ddddd ee
將變成這個(點代表空格):
.aaa. bbbb. ..c.. ddddd .ee..
任何工具都可以。無論是它
sed
還是awk
一堆coreutils
工具。編輯:我認為你們中的一些人誤解了輸出。輸出用空格而不是點填充。我在這裡使用點只是為了更清楚。
我會用vim。從正常模式:
:%center 5
…將作用於文件中的每一行(
%
在這種情況下就是 the 的含義),將其居中為五個字元(在 vim 文件中稱為列)。這將完全按照您的描述進行。要獲取文件中最長的行(用於中心命令),請使用wc -L file.txt
; 或在 vim 中::! wc -L %
不幸的是,這在 vanilla vi 中不可用,但由於它被標記為“linux”,因此您的儲存庫中可能至少有 vim。
您也可以在一行中執行此操作:
vim file.txt -c '%center 5' -c 'wq' &> /dev/null
…但我確信這不是最快的做事方式。
這是使用 awk ( pad.awk ) 的一種方法:
# Determine length of longest line FNR == NR { if(length > M) M = length; next } # Pad each line according current line length (L) and longest line (M) { L = M - length; for(i=1; i<=int(L/2); i++) printf "." printf "%s", $0 for(i=1; i<=int(L/2+.5); i++) printf "." printf "\n" }
像這樣執行它:
awk -f pad.awk infile infile
輸出:
.aaa. bbbb. ..c.. ddddd .ee..
如果您有可用的 GNU wc,則可以更有效地找到最長的行
wc -L
。也就是說,刪除pad.awk的第一行並像這樣執行 awk:awk -f pad.awk M=$(wc -L < infile) infile
###更新
我錯過了有關空格填充字元串的內容。無論如何,允許可變填充字元是相當簡單的。這是基於上述想法的完整範例:
# Set padding character to the default (" ") if it was not set with -v # Set ORS to "" to make printing easier BEGIN { if(D == "") D = " "; ORS = "" } # Pad each line according current line length (L) and longest line (M) { L = M - length; for(i=1; i<=int(L/2); i++) print D print $0 for(i=1; i<=int(L/2+.5); i++) print D print "\n" }
例子:
awk -v M=$(wc -L < infile) -v D=_ -f pad.awk infile
輸出:
_aaa_ bbbb_ __c__ ddddd _ee__