Вот вообще без сторонних утилит типа fold, wc и т.д.#!/bin/bash
#USAGE: cat file_to_process | script_name [line_width]
screen_width=$(tput cols)
line_width=${1:-$[$screen_width-4]}
t=$[($screen_width-$line_width)/2] # рассчитываем сдвиг
function my_print() {
printf "%*s" $t # сдвигаем на ½ свободного места
echo "${l[*]}" # выводим форматированную строку
}
while read -a line # считываем строку в виде массива слов
do
if [ "${line[*]}" ] # проверяем пустая строка или нет
then
n=0 # сбрасываем длину подстроки
for ((i=0;i<${#line[*]};i++)) # перебираем слова в строке
do
s=$[$n+${#line[i]}] # устанавливаем расчетную длину подстроки со следующим словом
if [ $s -ge $line_width ] # проверяем соответствие расчетной длины подстроки условию
then
k=0 # сбрасываем счетчик слов подстроки
while [ $n -lt $line_width ] # проверяем соответствие длины подстроки условию
do
l[k]="${l[k]} " # добавляем пробел к одному слову подстроки
n=$[$n+1] # увеличиваем длину подстроки (добавили пробел)
if [ $[++k] -lt ${#l[*]} ] # проверяем достигнуто ли последнее слово подстроки
then
k=0 # начинаем форматирование подстроки с её 1-го слова
fi
done
my_print # выводим подстроку на экран
unset l # обнуляем массив подстроки
n=$[${#line[i]}+1] # устанавливаем длину новой подстроки = следующее слово + пробел
else
n=$[$s+1] # приравниваем расчетную длину фактической + длину пробела
fi
l[${#l[*]}]=${line[i]} # добавляем к массиву подстроки следующее слово
done
my_print # выводим на экран последнюю (неполную) подстроку
else
echo "${line[*]}" # выводим на экран пустую строку (если она была в тексте)
fi
done
Можно конечно второй массив и не делать, но код более запутанный становится. Хотя если осуществлять другой алгоритм форматирования (например пробел с начала, потом пробел с конца) то может и будет иметь смысл.