ファイル名と一致するパターンにファイルを挿入するにはどうすればよいですか?

ファイル名と一致するパターンにファイルを挿入するにはどうすればよいですか?

3つのファイルがあるとしましょう。

index.html

And here is foo:
<!-- include: includes/foo.html -->

This can be done similarly:
<code>
<!-- include: includes/bar.txt -->
</code>

includes/foo.html

FOO CONTENTS
FOO CONTENTS
FOO CONTENTS

includes/bar.txt

BAR CONTENTS
BAR CONTENTS
BAR CONTENTS
BAR CONTENTS
BAR CONTENTS

同様のコマンドを使用してincludesを自動的に置き換えるにはどうすればよいですかawk 'some magic code' index.html > compiled.html

compiled.html

And here is foo:
FOO CONTENTS
FOO CONTENTS

This can be done similarly:
<code>
BAR CONTENTS
BAR CONTENTS
BAR CONTENTS
BAR CONTENTS
BAR CONTENTS
</code>

追加コメント

  • そのファイルが存在しない場合は、警告またはエラーが発生する必要があります(優先)(<!-- include: includes/does-not-exist.txt -->)。
  • <!-- include: ... -->は次の位置にあってはいけません。compiled.html
  • 私は文法にinclude柔軟です。簡単にすることもできます<include "includes/foo.html">
  • 私は」ポインタファイル「しかし、ハードコードされたファイル名もなく、ポインタを含むファイル行もありません。
  • コマンドですべてをinclude手動で指定する必要はありません。 (awk 'some magic code' index.html includes/foo.html includes/bar.txt > compiled.html許可されていません)
  • ほとんどのファイル名のみを処理し、あまりにも多くのツールは必要ありません(たとえば、使用するためにPHPサーバーをインストールしないことをお勧めします<? include "includes/bar.txt" ?>)。

ベストアンサー1

そしてperl

perl -0777 -pe 'while (s{<!-- include: (.*?) -->}{
  open I, "<", $1; <I>}ge) {}' index.html > compiled.html

whileより多くのファイルを含むループを許可するには、再帰的に作成します。)

これキャプチャグループ (.*?)ファイル名を検索してファイルに含めますFH$1

エラー処理:

perl -0777 -pe '
  while (
    s{<!-- include: (.*?) -->}{
      if (open I, "<", $1) {
        <I>;
      } else {
        warn "$1: $!\n";
        $ret = 1; 
        "<!-- failed-include: $1 -->"
      }
    }ge
  ) {}
  END {exit $ret}' index.html > compiled.html

おすすめ記事