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
同様のコマンドを使用してinclude
sを自動的に置き換えるにはどうすればよいですか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
より多くのファイルを含むループを許可するには、再帰的に作成します。)
これキャプチャグループ (.*?)
ファイル名を検索してファイルに含めますF
。H
$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