Bash:如何连接多个文件并在它们之间添加"\newline"?

5

我有一个小的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个回答

10

如果您想要字面字符串"\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删除它。


5
您可以进行以下操作:
for f in *.md; do cat "${f}"; echo; done > output.md

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


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插入文件命令,
  • aed在当前行后开始一个新行进行编辑,
  • \newline:好吧,我们处于插入模式,所以ed只是插入这个,
  • .:停止插入模式。

最后,我们将缓冲区写入文件output.md并退出q


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接