用 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')
给定一个 "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')