[Markdown] ファイルの先頭にファイル名を繰り返し追加します。

[Markdown] ファイルの先頭にファイル名を繰り返し追加します。

内部には多くのフォルダがあるフォルダがあり、各フォルダには多くの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行も良いでしょう!

乾杯。

ベストアンサー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バッファのアドレスまたは行番号であり、ORを表すa演算です。appendadd

アドインは、""ファイルの次の行の前に空の行を作成することです。

代わりに1i(最初の行に挿入することを意味します)も0a 機能しますが、空のファイルの場合は失敗します。

.edにファイルの編集が完了したことを通知し、wファイルに書き込むことを意味します。

|にパイプするedことは -s沈黙を意味し、何も出力しませんstdout

残りはbashシェルの変数割り当てとPEだけです。

おすすめ記事