【问题标题】:Unable to output values in the required format using shell script无法使用 shell 脚本以所需格式输出值
【发布时间】:2018-06-09 08:01:02
【问题描述】:
我需要将数组输出到以下格式的文件中。
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
谁能帮我得到所需格式的输出。
【问题讨论】:
标签:
bash
shell
format
printf
echo
【解决方案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 移出位置参数列表,并在插入间隔字符串的情况下打印其余部分。
【解决方案2】:
使用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 命令我们添加到所有行,除了第一行,六个空格等于字符串File: 的长度
【解决方案3】:
您总是可以在第一次迭代时从包含File: 的变量开始,每次都用正确数量的空格覆盖它。重复分配不会产生太多开销。
prefix="File:"
for i in "${files[@]}"
do
printf "%-7s %-30s \n" "$prefix" "$i"
prefix=
done > Files.txt