我需要以下列格式将数组输出到文件中。
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
任何人都可以帮助我以所需的格式获得输出。
答案 0 :(得分:1)
#!/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
从位置参数列表中移开,并使用插入的间隔字符串打印其余部分。
答案 1 :(得分:0)
使用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
)放入txt文件中。之后,通过第一个sed
命令,我们将File:
添加到第一行,并通过第二个sed
命令添加到所有行,除了第一个,六个空格等于字符串{{的长度1}}
答案 2 :(得分:0)
您可以始终使用包含File:
的变量开始第一次迭代,并使用每次正确的空格数覆盖它。重复的任务不会导致过多的开销。
prefix="File:"
for i in "${files[@]}"
do
printf "%-7s %-30s \n" "$prefix" "$i"
prefix=
done > Files.txt