Aqui está uma maneira de fazer isso com o awk ( 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"
}
Execute assim:
awk -f pad.awk infile infile
Saída:
.aaa.
bbbb.
..c..
ddddd
.ee..
Se você tem o GNU wc disponível, a linha mais longa pode ser encontrada com mais eficiência em wc -L
. Isto é, solte a primeira linha de pad.awk e execute o awk assim:
awk -f pad.awk M=$(wc -L < infile) infile
Atualizar
Eu senti falta da parte sobre strings espaciais. De qualquer forma, é bastante simples permitir um caractere de preenchimento variável. Aqui está um exemplo completo com base nas ideias acima:
# 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"
}
Exemplo:
awk -v M=$(wc -L < infile) -v D=_ -f pad.awk infile
Saída:
_aaa_
bbbb_
__c__
ddddd
_ee__