无法使用 shell 脚本以所需格式输出值

Unable to output values in the required format using shell script

我需要按照以下格式将数组输出到文件中。

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

任何人都可以帮助我获得所需格式的输出。

使用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

首先我们将所有文件名放入txt文件中(for loop)。之后,通过第一个 sed 命令,我们将 File: 添加到第一行,通过第二个 sed 命令,我们将添加到除第一行之外的所有行,六个空格等于字符串的长度 File:

#!/bin/bash

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

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

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

输出:

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

这利用了 printf 将对所有其他命令行参数重用其格式字符串的事实。

我们将位置参数设置为列表,然后输出第一个元素,并在前面加上 File: 字符串。然后我们将 移出位置参数列表并打印其余部分并插入一个间隔字符串。

您始终可以在第一次迭代时从包含 File: 的变量开始,然后每次都用正确的空格数覆盖它。重复赋值不会带来太大的开销。

prefix="File:"

for i in "${files[@]}"
do 
   printf "%-7s %-30s \n" "$prefix" "$i"
   prefix=
done > Files.txt