両側にパディングを使用したテキストの中央揃え

両側にパディングを使用したテキストの中央揃え

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

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

aaa
bbbb
c
ddddd
ee

次のようになります(ドットはスペースを表します)。

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

どんなツールでも可能です。sedそれawkまたは多くのcoreutilsツールの一つです。

編集する:出力結果を誤解した方もいらっしゃるようです。出力が入力されます。スペース、ポイントではありません。ここでは、より明確にするために点を使用しています。

答え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つの方法は次のとおりです(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__

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

注:2.7より前のバージョンのPythonを使用している場合は機能しません。

同じ出力:

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

関連情報