列の幅が入力の最長行になるようにテキストを中央に揃え、両側にパディングを揃える簡単な方法はありますか?
たとえば、次のようになります。
aaa
bbbb
c
ddddd
ee
次のようになります(ドットはスペースを表します)。
.aaa.
bbbb.
..c..
ddddd
.ee..
どんなツールでも可能です。sed
それawk
または多くのcoreutils
ツールの一つです。
編集する:出力結果を誤解した方もいらっしゃるようです。出力が入力されます。スペース、ポイントではありません。ここでは、より明確にするために点を使用しています。
答え1
vimを使用できます。通常モードでは:
:%center 5
...ファイルの各行に対して動作し(この場合は意味%
)、最大5文字まで囲みます(vimドキュメントでは列と呼ばれます)。これはあなたが説明するものと正確に一致します。ファイルから最も長い行を取得するには(centerコマンドの場合)、wc -L file.txt
vimから。
:! 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.