Экранирование запятых в выражениях m4 ifdef

Я использую комбинацию уценки и m4 для создания трех разных версий документа в зависимости от флагов, указанных в начале. Назовем их Золото, Серебро и Бронза.

Проблема, с которой я столкнулся, заключается в том, что если у меня есть раздел, который появляется в операторе ifdef с запятыми, m4 считает остальную часть раздела ложной.

ifdef(`GOLDANDSILVER',dnl
## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.
)dnl

Интересно, что это происходит не в подразделе, а в основном тексте.

Мое текущее уродливое решение состоит в том, чтобы использовать «фиктивную запятую», которую можно передать и заменить на sed.

ifdef(`GOLDANDSILVER',dnl
## Here's a subsection header

### Subsubsection about thisREPLACE_ME_COMMA thatREPLACE_ME_COMMA and the other thing

Aren't examples fun? Here's some punctuationREPLACE_ME_COMMA failureREPLACE_ME_COMMA and misfortune.
)dnl

Я ищу более чистое, предпочтительно только для m4, решение, которое позволяет мне иметь «,» в теле моих операторов ifdef.


Что я понял методом проб и ошибок:

  • m4, кажется, игнорирует любой контент или определения в строках с префиксом #
  • [,] не выходит запятая
  • [[,]] не выходит запятая

person aepksbuck    schedule 06.03.2017    source источник
comment
Вы видели мой ответ? Это работает?   -  person uzsolt    schedule 08.03.2017
comment
Он работает в небольшом масштабе, но по какой-то причине в документе есть что-то еще, из-за чего он больше не компилируется в HTML. Пока я просто придерживаюсь REPLACE_ME_COMMA.   -  person aepksbuck    schedule 13.03.2017
comment
Если вы приведете сложный пример, я могу его проверить.   -  person uzsolt    schedule 13.03.2017
comment
comp.mail.sendmail.narkive. com/2JrKqHp4/ Пример: определить(`INBOUND_CIDRS_VAL', ``0.0.0.0/0, ::/0'')   -  person malcolm    schedule 20.05.2021


Ответы (1)


Лучше всего использовать разделители строк. Разделители строк по умолчанию - не лучшее решение (я думаю), но вы можете изменить их с помощью changequote.

Вы можете изменить разделители комментариев (по умолчанию # и новая строка) и даже отключить их.

Я думаю, что следующее будет хорошо для вас:

ifdef(`GOLDANDSILVER',changequote(XXX,YYY)dnl
XXX## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.YYY changequote()
)dnl

Обратите внимание на changequote(XXX,YYY): цитата начинается с XXX и заканчивается на YYY. В этом случае строка, начинающаяся с #, не является комментарием, поскольку является частью строки. И обратите внимание на changequote(): он восстанавливает разделители строк по умолчанию.

$  cat x.m4 | m4 -DGOLDANDSILVER # GOLDANDSILVER is defined
## Here's a subsection header

### Subsubsection about this, that, and the other thing

Aren't examples fun? Here's some punctuation, failure, and misfortune.
$  cat x.m4 | m4 # GOLDANDSILVER isn't defined
$
person uzsolt    schedule 06.03.2017