在 m4 ifdef 语句中转义逗号
Escaping Commas in m4 ifdef Statements
我正在使用 markdown 和 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
有趣的是,它没有在小节上失败,但在正文中失败了。
我目前的丑陋解决方案是使用 'dummy comma' 可以通过管道传输到 sed 并由 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 似乎忽略了前缀为#
的行上的任何内容或定义
- [] 不转义逗号
- [[]] 不转义逗号
最好的办法是使用字符串定界符。默认的字符串定界符不是最好的解决方案(我认为)——但您可以使用 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
$
我正在使用 markdown 和 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
有趣的是,它没有在小节上失败,但在正文中失败了。
我目前的丑陋解决方案是使用 'dummy comma' 可以通过管道传输到 sed 并由 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 似乎忽略了前缀为# 的行上的任何内容或定义
- [] 不转义逗号
- [[]] 不转义逗号
最好的办法是使用字符串定界符。默认的字符串定界符不是最好的解决方案(我认为)——但您可以使用 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
$