Возвращает количество строк, необходимое для абзацев текста для заданной ширины в Bash - PullRequest
0 голосов
/ 16 февраля 2019

Учитывая ширину, я пытаюсь вычислить, сколько строк займет блок текста, который содержит абзацы (\ n окончания строки).

Я не могу просто разделить количество символов на ширину, потому чтоокончания строк создают новые строки рано.Я не могу сосчитать окончания строк только потому, что некоторые абзацы будут перенесены.

Я думаю, что мне нужно перебрать абзацы, разделив символы по ширине для каждого и сложив результаты вместе.

    count_lines() {
    TEXT="$(echo -e $1)"
    WIDTH=$2
    LINES=0
    for i in "${TEXT[@]}"
    do
    PAR=$(echo -e "$i" | wc -c)
    LINES=$LINES + (( $PAR / $WIDTH ))
    done
    RETURN $LINES
}

Чтение текста как массива не сработало.

1 Ответ

0 голосов
/ 16 февраля 2019
count_lines() {
  fmt -w "$2" <<<"$1" | wc -l
}
  • fmt является давним (представлен еще в Plan 9 и частью coreutils в системах GNU) инструментом UNIX, который оборачивает текст до желаемой ширины.
  • <<< это синтаксис herestring, ksh и bash, альтернативный heredocs, который позволяет использовать их без разбиения скрипта на несколько строк.

Тестирование:

text=$(cat <<'EOF'
This is a sample document with multiple paragraphs. This paragraph is the first one.

This is the second paragraph of the sample document.
EOF
)
count_lines "$text" 20

... возвращает доход 10.Это правильно, потому что текст переносится следующим образом (строки в начале добавлены для удобства чтения):

 1 This is a
 2 sample document
 3 with multiple
 4 paragraphs. This
 5 paragraph is the
 6 first one.
 7 
 8 This is the second
 9 paragraph of the
10 sample document.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...