Я провел некоторое исследование и могу заключить, что цитирование include
заставляет patsubst
больше не распознавать ^
(начало строки) в тексте, кроме первой строки.по крайней мере, в моей системе.
$ m4 --version
m4 (GNU M4) 1.4.18
...
Обратите внимание:
$ cat textnocomma
some text.
with sentences.
and no commas.
$ cat includenocomma
foo
patsubst(include(textnocomma), `^', ` ')
bar
patsubst(`include(textnocomma)', `^', ` ')
baz
$ m4 includenocomma
foo
some text.
with sentences.
and no commas.
bar
some text.
with sentences.
and no commas.
baz
это также происходит при определении текста как "строковые литералы" вместо include
:
$ cat definestringliterals
define(`sometext', `first line
second line
third line')dnl
foo
patsubst(sometext, `^', ` ')
bar
patsubst(`sometext', `^', ` ')
baz
$ m4 definestringliterals
foo
first line
second line
third line
bar
first line
second line
third line
baz
вот вопрос и ответ, который поддерживает это наблюдение: Как сопоставить символы новой строки в GNU M4 _properly_
странно, что этого не происходит, если поместить строковые литералы непосредственно внутри patsubst
:
$ cat patsubststringliterals
foo
patsubst(first line
second line
third line, `^', ` ')
bar
patsubst(`first line
second line
third line', `^', ` ')
baz
$ m4 patsubststringliterals
foo
first line
second line
third line
bar
first line
second line
third line
baz
Использование паренов для "цитирования" текста не имеет этой проблемы.но теперь в моем тексте есть круглые скобки:
$ cat textcomma
some text.
with sentences.
and, commas.
$ cat includecomma
foo
patsubst(include(textcomma), `^', ` ')
bar
patsubst(`include(textcomma)', `^', ` ')
baz
patsubst((include(textcomma)), `^', ` ')
qux
$ m4 includecomma
foo
m4:includecomma:2: Warning: excess arguments to builtin `patsubst' ignored
some text.
with sentences.
and
bar
some text.
with sentences.
and, commas.
baz
(some text.
with sentences.
and, commas.
)
qux
, так что я думаю, что это ошибка.если кавычка include
, то patsubst
больше не будет распознавать ^
, кроме первой строки.Но цитирование include
необходимо, чтобы запятая в тексте не интерпретировалась как синтаксис.