有没有办法使用 m4 包含包含文件中的行子集?

Is there a way to include a subset of lines from an included file using m4?

有没有办法在使用 m4 时从包含的文件中包含行的子集?类似于 include(`source.cpp', 12-15)?

的内容

我正在使用 reveal.js 创建一个 markdown 演示文稿,并希望包含代码示例。在许多情况下,我想包含源文件中的一部分行。在那些情况下,我创建了文件的副本并将每个副本修剪为每次包含时应包含的内容。然而,这会导致多个源文件,如果公共行发生更改,则需要手动更新这些文件。我想在多个地方包含同一个文件,指定在每次包含时包含哪些行。

我考虑过使用 sed,但希望尽可能避免使用外部工具。我还希望能够使用 m4 -I 选项指定包含的文件夹。

欢迎就使用外部工具的 m4 宏提出建议,即使仅使用 m4 的答案也值得赞赏。

能行!

define(`repeat_newline',`ifelse(,0,,`[^
]*
repeat_newline(decr())')')dnl
define(`quote',``$*'')dnl
define(`include_lines',`regexp(quote(include()),^repeat_newline()`\('repeat_newline()`\)',`')')

用法:include_lines(my_file.txt, 2, 5) 从第三行开始读取 5 行(2 是零索引)。它扩展包含文件中的宏,就像 include.

This however leads to multiple source files which need to be updated manually if a common line changes.

主要问题是如何插入新版本的代码示例(修订版)。也就是说,您可以插入 固定文本 调用外部命令。

syscmd(`sed -n "12,15p" source.cpp')dnl

M4 在扩展宏 include 后重新扫描插入的文本,而调用 sed 插入的文本是字面输出(不被 M4 解析)。