有没有一种方法可以使用m4包含包含文件中的行的子集



使用m4时,是否有方法包含包含文件中的行子集?类似include(`source.cpp', 12-15)?的东西

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

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

对于使用外部工具的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一样。

但是,如果公共行发生更改,则会导致多个源文件需要手动更新。

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

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

M4在宏CCD_ 6的扩展之后重新扫描插入的文本,而调用CCD_。

最新更新