我有一个小的Bash脚本,它接受目录的所有Markdown文件,并将它们合并为如下所示:
for f in *.md; do (cat "${f}";) >> output.md; done
效果很好。现在我想在每个文档之间添加字符串“\ newline”,如下所示:
for f in *.md; do (cat "${f}";) + "\newline" >> output.md; done
我该怎么做?上面的代码显然不起作用。
答案 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 $f
:r
是ed
&#39> 插入文件命令,a
:ed
在当前行之后开始换行,\newline
:嗯,我们正在进行插入模式,因此ed
只需插入此内容,.
:停止插入模式。最后,我们w
将缓冲区设置为文件output.md
和q
uit。