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