Shell-Script

將文本居中對齊,兩邊都有填充

  • October 25, 2021

有沒有一種簡單的方法可以將文本與兩側的填充對齊,列寬是輸入中最長的行?

例如,這個:

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__

引用自:https://unix.stackexchange.com/questions/94748