將文字置中對齊,兩側填充

將文字置中對齊,兩側填充

有沒有簡單的方法可以將文字對齊到中心並在兩側填充,列寬是輸入中最長的行?

例如,這個:

aaa
bbbb
c
ddddd
ee

將變成這樣(點代表空格):

.aaa.
bbbb.
..c..
ddddd
.ee..

任何工具都可以。sed無論是它awk還是一堆coreutils工具。

編輯:我認為你們中的一些人誤解了輸出。輸出被填充空間,不是點。我在這裡使用點只是為了讓它更清楚。

答案1

我會用vim。從正常模式:

:%center 5

……將作用於文件中的每一行(這就是本例中的意義%),將其集中到五個字元(在 vim 文件中稱為列)。這將完全按照您的描述進行操作。若要取得檔案中最長的行(用於 center 指令),請使用wc -L file.txt;或在 vim 中:

:! wc -L %

不幸的是,這在 vanilla vi 中不可用,但由於它被標記為“linux”,因此您的儲存庫中可能至少有 vim。

您也可以在一行中執行此操作:

vim file.txt -c '%center 5' -c 'wq' &> /dev/null

……但我確信這不是最快的做事方式。

答案2

這是使用 awk 實現的一種方法(墊.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。也就是說,刪除第一行墊.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__

答案3

這是我的解決方案,如我的對托爾的回答發表評論:

awk -v M="`wc -L file`" '{ printf "%*s%*s", (M+length)/2, $0, (M-length+1)/2+1, "\n" }' < file

我覺得它優雅而簡潔地解決了問題,因此我將其重新發布作為答案。

答案4

使用Python:

#!/usr/bin/env python

with open('input.txt') as file:
    for line in file:
        l = line.strip()
        print l.center(5,'.'),"\n",

注意:如果您使用的是低於 2.7 的 Python 舊版本,那麼這將不起作用。

相同的輸出:

rahul@home-pc:~/work$ python format_center.py
.aaa. 
.bbbb 
..c.. 
ddddd 
..ee.

相關內容