我有一个小的Bash脚本,可以将某个目录下的所有Markdown文件合并成一个,像这样:
for f in *.md; do (cat "${f}";) >> output.md; done
它很好用。现在我想在每个文档之间添加字符串"\newline",就像这样:
for f in *.md; do (cat "${f}";) + "\newline" >> output.md; done
我该怎么做?上面的代码显然不起作用。
如果您想要字面字符串"\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
删除它。
for f in *.md; do cat "${f}"; echo; done > output.md
您可以添加 echo
命令来添加一个换行符。为了提高性能,建议将写入 >
移动到 for
循环之外,以防止在每次迭代时读取和写入文件。
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 $f
: r
是ed
的插入文件命令,a
: ed
在当前行后开始一个新行进行编辑,\newline
:好吧,我们处于插入模式,所以ed
只是插入这个,.
:停止插入模式。最后,我们将缓冲区写入文件output.md
并退出q
。