首页 > 解决方案 > 有没有办法使用 m4 从包含的文件中包含一部分行?

问题描述

使用 m4 时,有没有办法从包含的文件中包含一部分行?类似的东西include(`source.cpp', 12-15)?

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

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

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

标签: m4

解决方案


可以做!

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

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


推荐阅读