将文本居中对齐,两侧填充

将文本居中对齐,两侧填充

有没有一种简单的方法可以将文本对齐到中心并在两侧填充,列宽是输入中最长的行?

例如,这个:

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.

相关内容