Невозможно вывести значения в нужном формате с помощью сценария оболочки - PullRequest
0 голосов
/ 09 июня 2018

Мне нужно вывести массив в файл в следующем формате.

File: a.txt
      b.txt

Я попытался сделать следующее:

declare -a files=("a.txt" "b.txt")
empty=""
printf "File:" >> files.txt
for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$empty" "$i" >> files.txt
done 

Но я получаю вывод как

 File: a.txt
 b.txt

Может кто-нибудь, пожалуйста, помогите мне получить вывод в требуемом формате.

Ответы [ 3 ]

0 голосов
/ 09 июня 2018
#!/bin/bash

files=( 'a.txt' 'b.txt' 'c.txt' 'd.txt' )

set -- "${files[@]}"

printf 'File: %s\n' "$1"
shift
printf '      %s\n' "$@"

Вывод:

File: a.txt
      b.txt
      c.txt
      d.txt

При этом используется тот факт, что printf будет повторно использовать свою строку форматирования для всех других параметров командной строки.

Мы устанавливаем позиционные параметры равнымисписок, а затем выведите первый элемент с добавленной строкой File:.Затем мы вытесняем $1 из списка позиционных параметров и печатаем остальное со вставленной строкой-пробелом.

0 голосов
/ 09 июня 2018

Вы всегда можете начать с переменной, содержащей File: для первой итерации, и каждый раз перезаписывать ее правильным количеством пробелов.Повторное назначение не вызовет слишком много накладных расходов.

prefix="File:"

for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$prefix" "$i"
   prefix=
done > Files.txt
0 голосов
/ 09 июня 2018

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

#!/bin/bash

declare -a files=("a.txt" "b.txt")

for i in "${files[@]}"
do
   echo "$i" >> files.txt
done
sed -i '1 s/^/File: /' files.txt
sed -i '1 ! s/^/      /' files.txt

Если вы используете Mac, вам нужно изменить команды sed таким образом

sed -i '' '1 s/^/File: /' files.txt
sed -i '' '1 ! s/^/      /' files.txt

Вывод будет:

File: a.txt
      b.txt

Прежде всего мы помещаем в текстовый файл все имена файлов (for loop).После этого с помощью первой команды sed мы добавляем File: в первую строку, а второй командой sed добавляем во все строки, кроме первой, шесть пробелов, равных длине строки File:

...