无法使用 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
我需要按照以下格式将数组输出到文件中。
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