我有一个文件夹,里面有很多文件夹,每个文件夹都有很多 Markdown 文件。我想做的是递归地(如果可能)将文件名作为每个文件中的标题。
所以,给定foo.md
:
The cat sat on the carpet, which is really just endless mat to a cat.
我想要:
# Foo.md
The cat sat on the carpet, which is really just endless mat to a cat.
我不关心文件扩展名。我很烦恼它是一个有效的 Markdown 标题 1,后面有一行。
我的文件结构看起来像
md/
foo/
heaps.md
and.md
bar/
heaps.md
of.md
baz/
files.md
omg.md
等等等等。理想情况下,我想要一些可以复制到 .sh 或类似文件中的东西,但单行也很好!
干杯。
答案1
尝试 bash 的 globstar 和 ed 加上一些 PE,我建议您首先尝试一些示例数据/目录。
shopt -s globstar
for f in md/**/*.md; do
header=${f##*/} header=${header^}
printf '%s\n' 0a "# $header" "" . w | ed -s "$f"
done
或者是单衬,但记得要设置globstar
for f in md/**/*.md; do header=${f##*/} header=${header^}; printf '%s\n' 0a "# $header" "" . w | ed -s "$f" ; done
要在 globstar 仍然打开时检查文件的内容,您可以尝试。
tail -n+1 md/**/*.md
0
是缓冲区中的地址或行号,是表示或的a
操作append
add
额外的""
是在文件中的下一行之前创建一个空行。
虽然1i
(这意味着在第一行插入)代替0a
也可以工作,但对于空文件它将失败。
.
告诉 ed 文件编辑完成并w
意味着将其写入文件
管道|
到ed
和 -s
意味着沉默并且不输出任何内容到stdout
。
剩下的只是 bash shell 中的一些变量分配和 PE。