Как отформатировать вывод скрипта, чтобы он имел одинаковое количество пробелов

Вот мой сценарий:

#!/bin/bash
declare -a a=(`ls`)
declare -a b=()
declare -a sorted_arr=()

var =0

while [ -n "${a[$var]}" ]
do

    echo "${a[$var]:0:10}              |"
    var=`expr $var + 1`

done

Этот сценарий создает непоследовательный интервал

another_fi              |
f2.txt              |
file1.txt              |
file3.txt              |

Я хочу, чтобы вертикальные символы конвейера были выровнены

another_fi             |
f2.txt                 |
file1.txt              |
file3.txt              |
7
задан 8 June 2017 в 17:15

1 ответ

Основная причина в том, что ваша команда echo берет x символов из переменной и содержит 14 пробелов. Это означает, что общее количество символов в пространстве выходной строки не будет согласованным.

Вместо этого вы можете использовать printf со спецификатором ширины %-10s для отступа слева следующим образом:

bash-4.3$ for i in "${a[@]}"; do     printf "%-10s%-4s|\n"  "${i:0:10}" " "; done
1.wav         |
2.wav         |
3.wav         |
input.txt     |

Таким образом, любая переменная, которая у вас есть, будет сделана так, чтобы соответствовать 10 к этим 10 символам мы добавляем 4. Знак - делает каждую строку выравниваемой по левому краю.

Число -10 в %-10s должно оставаться неизменным, чтобы гарантировать, что даже если файл короче 10 символов, мы все равно получим строку из 10 символов с добавленными пробелами. Но %-4s часть может быть разнообразной. Например, в приведенном выше примере у %-4s будет 4 пробела, но если мы хотим иметь 14 пробелов, используйте %-14s.


Обратите внимание, что обычно рекомендуется использовать против парсинга вывода команды ls , что именно то, что вы делаете. В качестве альтернативы мы можем использовать команду find со структурой while IFS= read -r -d '' следующим образом:

bash-4.3$ find -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file;
> do
>     printf "%-10s%-4s|\n"  "${file:0:10}" " "
> done
./3.wav       |
./1.wav       |
./2.wav       |
./.swp        |
./input.tx    |

Обратите внимание, что find является рекурсивным, поэтому она работает и с подкаталогами. Если вы хотите избежать этого, используйте опцию -maxdepth 1.

Обратите внимание, что find также имеет свою собственную опцию -printf, которая может быть более эффективной, если все будет выполнено одним процессом, а не двумя (это find плюс подоболочка, в которой работает while):

$ find /bin -type f -printf "%-15f|\n" 2>/dev/null | head -n 5
hostname       |
nc.traditional |
fusermount     |
loadkeys       |
zless          |

В идеале я бы предложил записать все во временный файл, вычислить самую длинную строку (или самое длинное имя файла в файле) и заполнить столько пробелов, сколько вы хотите, соответственно. [Тысяча сто двадцать семь]

0
ответ дан 8 June 2017 в 17:15

Другие вопросы по тегам:

Похожие вопросы: