No final, resolvi isso usando m4. Para fazer qualquer comando 'sed' que possa ser lançado neste trabalho, o m4 não deve fazer qualquer coisa exceto processar as macros do m4_include (), embora uma vez feito isso ele possa assumir que estamos realmente processando m4 entrada e fazer mais, como remover citações e, claro, inclusão recursiva etc, é ok.
Então, o que eu faço é substituir todas as ocorrências de 'm4_' no fluxo de entrada com alguma string mágica (xyzzy), altere as aspas para none inserindo um m4_changequote(,)
no início e canalize o resultado em m4. Isso garante que o m4 não fará absolutamente nada com a entrada. No entanto, eu quero processar m4_include
, então, antes de canalizá-lo para o m4, eu substituo xyzzyinclude([])
por m4_changequote([,])m4_include([])m4_changequote(,)
, fazendo com que o m4 processe o arquivo incluído com a cotação correta. Finalmente, a saída de m4 -P
é processada por sed novamente, substituindo a string mágica por 'm4 _'.
magic="xyzzy"
cat first.txt | /bin/sed "s/m4_/$magic/g;s/$magic""include(\[\([^]]*\)\])/m4_changequote([,])m4_include()m4_changequote(,)/g;1s/^/m4_changequote(,)/" | m4 -P - | sed "s/$magic/m4_/g"
Note que as restrições na string mágica são: ela não pode conter (a substring) m4_, ela não pode começar com um sublinhado ou com 4_ nem terminar em um m ou m4. Ele também não deve terminar com o mesmo caractere de início. Finalmente, se ocorrer no fluxo de entrada, ele não deverá prejudicar o propósito do script quando ele for substituído por 'm4 _'.
Tendo a seguinte entrada:
A1 m4_dnl Nothing should be changed.
A2 m4___file__
m4_include([second.txt])
A4 m4___line__
A5 [' Unmatched quoting: no problem.
e
This is second.txt, an m4 file.
The wizard said xyzzy,
and nothing happened.
Usando uma string 'mágica' de 'xyzzy', obtemos o resultado:
A1 m4_dnl Nothing should be changed.
A2 m4___file__
This is second.txt, an m4 file.
The wizard said m4_,
and nothing happened.
A4 m4___line__
A5 [' Unmatched quoting: no problem.
Para o propósito de libtoolize, usando um configure.ac que use m4_include's, isso é suficiente. Para o script completo do SED, consulte o link
Edit: acabou por não ser suficiente; Eu também tive que substituir m4 como um hack com link