テキストを中央揃えし、両側にパディングを入れる

テキストを中央揃えし、両側にパディングを入れる

列幅を入力からの最長行にして、両側にパディングを付けてテキストを中央に揃える簡単な方法はありますか?

たとえば、次のようになります。

aaa
bbbb
c
ddddd
ee

次のように変換されます (ドットはスペースを表します)。

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

どんなツールでも構いません。1 つのツールでも、sed複数awkcoreutilsツールでも構いません。

編集: 出力を誤解している方もいると思います。出力にはスペースドットではありません。ここでは、より明確にするためにドットを使用しました。

答え1

私はvimを使います。通常モードから:

:%center 5

...はファイル内のすべての行に作用し(この場合の意味は%)、5 文字(vim ドキュメントでは列と呼ばれます)に中央揃えされます。これはまさにあなたが説明したとおりに動作します。ファイル内の最長の行を取得するには(center コマンドで使用するため)、wc -L file.txtvim 内で ; または を使用します。

:! wc -L %

残念ながら、これは標準の vi では利用できませんが、これは「linux」のタグが付けられているため、少なくともリポジトリには vim が含まれている可能性があります。

次のようにして、これを 1 行で実行することもできます。

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

...しかし、それが最速の方法ではないことは確かです。

答え2

awk でこれを行う方法の 1 つを以下に示します (パッド.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

私の解決策は、私の投稿で紹介したとおりです。Thorの回答へのコメント:

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",

注意: Python 2.7 未満の古いバージョンを使用している場合、これは機能しません。

同じ出力:

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

関連情報