Как распечатать строку переменной длины в кусках фиксированной длины? - PullRequest
1 голос
/ 03 февраля 2012

Мне нужно проанализировать (с grep) и распечатать (с некоторым форматированием) содержимое журнала приложения.

Этот журнал содержит текстовые данные в строках переменной длины.Что мне нужно, так это после того, как мы поработаем, зациклим каждую строку этого вывода и распечатаем ее с максимальной фиксированной длиной 50 символов.Если строка длиннее 50 символов, она должна напечатать новую строку, а затем продолжить с остальными в следующей строке и т. Д., Пока строка не будет завершена.

Я пытался использовать printf, чтобы сделать это,но это не работает, и я не знаю почему.Он просто выводит строки в том же порядке, что и echo, без учета формата printf, хотя работает символ (вкладка) \t.

function printContext
{
    str="$1"
    log="$2"
    tmp="/tmp/deluge/$$"

    rm -f $tmp

    echo ""
    echo -e "\tLog entries for $str :"

    ln=$(grep -F "$str" "$log" &> "$tmp" ; cat "$tmp" | wc -l)

    if [ $ln -gt 0 ];
    then
            while read line
            do
                    printf "\t%50s\n" "$line"
            done < $tmp
    fi

}

Что не так?Я знаю, что могу выполнить подпрограмму для выполнения этой задачи, но printf должен пригодиться для подобных вещей.

Ответы [ 3 ]

4 голосов
/ 03 февраля 2012

Вместо:

printf "\t%50s\n" "$line"

использование

printf "\t%.50s\n" "$line"

для сокращения вашей строки до 50 символов.

0 голосов
/ 03 февраля 2012

Вот неуклюжий способ разбить строку на куски по 50 символов, только для bash

i=0
chars=50
while [[ -n "${y:$((chars*i)):$chars}" ]]; do
  printf "\t%s\n" "${y:$((chars*i)):$chars}"
  ((i++))
done
0 голосов
/ 03 февраля 2012

Я не уверен насчет printf, но вижу, как perl устанавливается везде, как насчет простого 1 liner?

<code>
echo $ln | perl -ne ' while( m/.{1,50}/g ){ print "$&\n" } '
...