Bash:连接多个文件并在每个文件之间添加“\ newline”?

时间:2014-05-22 19:00:11

标签: bash file cat

我有一个小的Bash脚本,它接受目录的所有Markdown文件,并将它们合并为如下所示:

for f in *.md; do (cat "${f}";) >> output.md; done

效果很好。现在我想在每个文档之间添加字符串“\ newline”,如下所示:

for f in *.md; do (cat "${f}";) + "\newline" >> output.md; done

我该怎么做?上面的代码显然不起作用。

3 个答案:

答案 0 :(得分:9)

如果你想要文字字符串"\newline",试试这个:

for f in *.md; do cat "$f"; echo "\newline"; done > output.md

这假定output.md尚不存在。如果是(并且您希望将其内容包含在最终输出中),您可以执行以下操作:

for f in *.md; do cat "$f"; echo "\newline"; done > out && mv out output.md

这可以防止错误cat: output.md: input file is output file

如果你想覆盖它,你应该在开始之前rm

答案 1 :(得分:4)

你可以这样做:

for f in *.md; do cat "${f}"; echo; done > output.md

您可以添加echo命令来添加换行符。为了提高性能,我建议将写>移到for循环之外,以防止在每次迭代时读取和写入文件。

答案 2 :(得分:1)

这是一个很有趣的可能性,使用标准编辑器ed

ed -s < <(
    for f in *.md; do
        [[ $f = output.md ]] && continue
        printf '%s\n' "r $f" a '\newline' .
    done
    printf '%s\n' "w output.md" "q"
)

(我已插入一行以从插入的文件中排除output.md。)

对于每个文件:

  • r $fred&#39> 插入文件命令,
  • aed在当前行之后开始换行,
  • \newline:嗯,我们正在进行插入模式,因此ed只需插入此内容,
  • .:停止插入模式。

最后,我们w将缓冲区设置为文件output.mdq uit。