for循环输出格式:添加带有描述和空格的换行符

时间:2016-07-25 15:58:03

标签: bash loops formatting

我正在浏览一个文件列表,并使用for循环将所有输出重定向到单个文件。我的循环有效,但我正在寻找一种方法来在每个文件的内容被转储之前添加描述符行,并在每个新文件条目之前添加一个空格。这是我的剧本。

#!/bin/bash

files=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}')

for i in $files; do /bin/cat "$i" >> "/home/user/catfiles.txt"
done

我的输出如下:

 spawn ssh user@x.x.x.x
 run $command
 quit
 spawn ssh user@x.x.x.x
 run $command
 quit

我希望它看起来像这样:

 "Description for first file here"
 spawn ssh user@x.x.x.x
 run $command
 quit
 <space>
 "Description for second file here"
 spawn ssh user@x.x.x.x
 run $command
 quit
 <space>

更新:文件描述名称需要使用实际文件名按文件而变化。

"This is $file1"
"This is $file2"
 etc,etc..

3 个答案:

答案 0 :(得分:1)

所以你想要这个,BTW你的files=$(ls -l /home/user/*.txt | awk 'NR>=2 {print $9}')错了,don't parse ls输出,jus使用shell:

for i in /home/user/*.txt; do
    echo "Description for first file here $i" >> /home/user/catfiles.txt
    /bin/cat "$i" >> "/home/user/catfiles.txt"
    echo >> /home/user/catfiles.txt
done

答案 1 :(得分:1)

这将根据您的需要合并它们:

for f in /home/user/*.txt;do
    echo "This is ${f##*/}" >> /home/user/catfiles.txt
    /bin/cat "${f}" >> /home/user/catfiles.txt
    echo >> /home/user/catfiles.txt
done

文件名打印,不带路径。如果您还希望打印路径,则只需将${f##*/}替换为${f}

<强>更新

${variable##pattern}称为参数替换。 Bash将在pattern中搜索variable并删除最长匹配。在这种情况下,变量为f,模式为*/,它匹配任何以斜杠结尾的String。双重哈希##表示删除f中可由*/匹配的最长字符串。由于f是一个路径,因此它会匹配并删除所有内容,包括最后一个/,因此只保留文件名。 Bash documentation有关于此主题的更详细信息。或者,您可以在man bash中搜索Parameter Expansion

答案 2 :(得分:0)

这将解决问题:

for i in /home/user/*; do
echo "This is from $i" >> "/home/user/catfiles.txt"
/bin/cat "$i" >> "/home/user/catfiles.txt"
    echo >> "/home/user/catfiles.txt"
done

因为&#34;我&#34;在这种情况下代表每个文件,以echo开头的第二行中的$ i将为您提供不同的文件名。

如果要排除文件路径,以便该行只具有不带/ home / user的文件名,则可以在第3行之后插入sed语句。

for i in /home/user/*; do
echo "This is from $i" >> "/home/user/catfiles.txt"
/bin/cat "$i" >> "/home/user/catfiles.txt"
/bin/sed -i -e 's/\/home\/user\///g' /home/user/catfiles.txt
    echo >> "/home/user/catfiles.txt"
done