有没有办法使用 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 解析)。
有没有办法在使用 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 解析)。