Как динамически создавать правила форматирования для printf? - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь напечатать несколько строк в нескольких столбцах шириной 30 символов:

#!/bin/bash
chars_width=15
full_string="a\\nb\\nc\\nd"
number_of_columns=$(( $(tput cols) / $chars_width ))

for ((i = 0; i < number_of_columns; i++)); do
    formatting_string="$formatting_string%%-"$chars_width"s "
done

echo "$full_string" | xargs -L $number_of_columns | \
    while read -r values
    do
        printf "$formatting_string\\n" $values
    done
exit

При выполнении этого я бы ожидал, что он выведет:

a              b              c              d

Но он выдаст:

%-15s %-15s %-15s %-15s

Как поставить мои динамически построенные правила форматирования для printf для использования?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Насколько вы доверяете своим данным?Вы можете позволить анализатору команд убрать лишние пробелы ценой некоторого риска.

$: full_string=$'a\nb\nc\nd'
$: printf %-15s $full_string $'\n'
a              b              c              d

Если ваши данные находятся в файле ...

$: r=( $(<file) )
$: printf %-15s "${r[@]}" $'\n'
a              b              c              d

или даже

$: printf %-15s $(<file) $'\n'
a              b              c              d

Что вы можете не увидеть, так это то, что символ новой строки был также напечатан в поле шириной 15, поэтому в конце строки много пробелов.

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

Размещение кавычек в неправильных местах может вызвать проблемы ...

$:  printf %-15s "$(<file)" $'\n'
a
b
c
d

Вы получите тот же результат от

$: printf %-15s "$full_string" $'\n'

Как правило, вы хочу цитаты, но полезные вещи можно сделать, творчески опуская их и позволяя анализатору манипулировать пробелами.Просто знайте, что вы получаете.если в одном из этих полей есть встроенный пробел, все ставки отключены.

Почти тот же набор предостережений применяется к самому формату.

$: f="%-15s %5s"
$: printf $f $x $'\n' # oops!
%5s            a              b              c              d
$: printf "$f" $x $'\n'
a                   bc                   d

Таким образом, вы можете динамически создавать разные форматы, еслиВы хотите, и просто заключите переменную в двойные кавычки, чтобы она анализировалась «правильно».Как всегда, проверьте это.

0 голосов
/ 01 марта 2019

Используйте одиночные символы '%' в строке формата.Вы избежали их, поэтому ничто не может быть заменено.

...