用 m4 安全替换文本,禁用新定义

Safely replacing text with m4, disabling new defines

给定一个 "rules" 文件和一个 "input" 文件,我想使用规则文件中定义的规则用 m4 处理输入文件。

因此,例如,如果规则文件包含

define(FOO, BAR)dnl

并且文本文件包含

FOO FOO define(FOO,BAZ) BAR

我想得到

BAR BAR define(BAR,BAZ) BAR

而不是预期的

BAR BAR  BAZ

我想使用一个文件来定义宏,并处理另一个文件,跳过 m4 行为中的任何新定义或更改。宏应该只是扩展,永远不要改变。

基本上,这是因为在文本文件中可能有一些文本看起来像M4代码,但实际上不是,我忽略了它。

或者,从另一个角度来看,我需要类似搜索和替换的东西,但能够定义 "complex" 带参数的宏。

这可能吗?

使用 -P 标志。

-P, --prefix-builtins force a `m4_' prefix to all builtins

rules.m4:

m4_define(FOO, BAR)m4_dnl

text.data:

FOO FOO define(FOO,BAZ) BAR

结果是:

$ make -P rules.m4 text.data
BAR BAR define(BAR,BAZ) BAR 

更新 1

您可以完全取消定义 m4_define 宏。那应该是 rules.m4 文件的最后一行。

m4_undefine(`m4_define')