Безопасная замена текста на m4, отключение новых определений

Учитывая файл «правил» и «входной» файл, я хотел бы обработать входной файл с помощью m4, используя правила, определенные в файле правил.

Так, например, если файл правил содержит

define(FOO, BAR)dnl

и текстовый файл содержит

FOO FOO define(FOO,BAZ) BAR

я хотел бы получить

BAR BAR define(BAR,BAZ) BAR

вместо ожидаемого

BAR BAR  BAZ

Я хотел бы использовать файл для определения макросов и обрабатывать другой файл, пропуская любые новые определения или изменения в поведении m4. Макросы должны быть просто расширены, а не изменены.

В основном это связано с тем, что в текстовом файле может быть некоторый текст, который выглядит как код M4, но это не так, и я должен его игнорировать.

Или, с другой точки зрения, мне нужно что-то вроде поиска и замены, но с возможностью определения «сложных» макросов с аргументами.

Это возможно?


m4
person AkiRoss    schedule 09.09.2015    source источник


Ответы (1)


Используйте флаг -P.

-P, --prefix-builtins принудительно использовать префикс m4_ для всех встроенных функций.

правила.m4:

m4_define(FOO, BAR)m4_dnl

текст.данные:

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')
person akond    schedule 10.09.2015
comment
Спасибо, я знал об этом, но это не решает проблему: что, если в тексте есть и m4_define(), и define()? Оглядевшись, я пришел к выводу, что, вероятно, нет простого решения моего ответа. - person AkiRoss; 14.09.2015
comment
Вы можете отменить определение макроса m4_define. - person akond; 14.09.2015
comment
Могу ли я также отменить определение всех других команд? неопределить(`неопределить')? А как же цитаты? В моем случае define был примером, но дело в том, чтобы предотвратить изменение поведения, но разрешить расширение макросов в обрабатываемом файле. - person AkiRoss; 14.09.2015
comment
Звучит как противоречие для меня. Расширение макроса — это изменение. Если изменений нет, макрос не расширяется. - person akond; 14.09.2015
comment
Вот почему я говорил о двух разных файлах: файле правил (правила -> не меняются) и входном файле (подлежит изменению), но я не хочу, чтобы содержимое входного файла изменяло правила, которые применяются к Это. - person AkiRoss; 15.09.2015
comment
Но m4 так не работает. Возможно, вам следует подумать о простой замене строки. - person akond; 15.09.2015