背景

背景

背景

私は次の問題に直面しています:m4_include([some/file.m4])私のconfigure.acファイルに閉じ込められています。ここで some/file.m4 には、「AC_INIT」や「LT_INIT」など、libtoolize が動作するために必要なパターンが含まれています。つまり、これらのパターンを見つけるためにconfig.acを前処理し、libtoolllizeがそれをsedに供給するにはm4が必要です。

私は(避けることができれば)configure.acを生成したくありません。私に役立つlibtoolizeが提供した唯一のフックは、環境変数SEDを見つけて/bin/sedの代わりに/bin/sedの代わりに使用したということです。

sed引数を解析して実際のsedに渡すシェルスクリプトを作成しました。残念ながら、libtoolizeはm4local.acとconfigure.acを接続してある時点で$ SEDに提供するため、「configure.ac」という入力ファイルを見つけることができません。それにもかかわらず、$ SEDに渡された引数を分析した後、すべての入力ファイルおよび/またはstdinを連結できます。なぜなら、最終的にはストリーム(stdin)から読んで動作しなければならないからです。

残りの質問

だから私が直面している問題は次のとおりです。

私のスクリプトは、似たような行に遭遇するまでstdinで読み、stdoutに書き込む必要があります。m4_include([cwm4/configure_ac_top.m4])その後、cwm4/configure_ac_top.m4の内容を飲み込んで挿入する必要があります。追加のm4前処理を必要とせずに含めるだけです。実際、sedは数え切れないほど多くの小さな操作に使用されるため、m4_include以外の前処理を実行するのは非常に危険です。しかし、再帰的でなければなりません。含まれるファイルに1行が含まれている場合は、m4_sinclude([lt_init.m4])そのファイルも含める必要があります。

このサイトでは、ファイルを別のファイルに挿入する方法を尋ねるいくつかの質問と回答を見つけましたが、挿入するファイルのファイル名が知られている(元のファイルから読み取られていない)、再帰的ではなく、多くの場合、そうです。標準入力では読み取られません(ただし、最初に知られているファイル名から読み取られます)。

ベストアンサー1

最後に、m4を使用してこの問題を解決しました。この操作で可能な「sed」コマンドを実行するには、m4は次のコマンドを実行しないでください。何もないm4_include() マクロを処理することに加えて、そうすれば、私たちが実際に m4 入力を処理していると仮定し、引用符を削除し、もちろん再帰を含めるなどを削除するなどの作業を実行できますが、大丈夫です。

だから私がしたのは、入力ストリームのすべての "m4_"エントリをいくつかの魔法文字列(xyzzy)に置き換え、最初にm4_changequote(,)aを挿入して引用符をなしに変更し、結果をm4にパイプすることでした。これにより、m4が入力に対してまったく動作しないことが保証されます。しかし、私はそれを処理したいm4_includeので、m4にパイプする前に、m4を含むファイルを処理するために正しい参照を使用するようにするxyzzyinclude([\1])ことに置き換えました。m4_changequote([,])m4_include([\1])m4_changequote(,)最後に、m4 -Psedの出力が再処理され、魔法文字列が「m4_」に置き換えられます。

magic="xyzzy"
cat first.txt | /bin/sed "s/m4_/$magic/g;s/$magic""include(\[\([^]]*\)\])/m4_changequote([,])m4_include(\1)m4_changequote(,)/g;1s/^/m4_changequote(,)/" | m4 -P - | sed "s/$magic/m4_/g"

マジック文字列の制限は次のとおりです。 (サブストリング)m4_を含めることができず、下線または4_で始めることができず、mまたはm4で終わることはできません。また、開始された文字と同じ文字で終わってはいけません。最後に、入力ストリームに表示される場合は、「m4_」で置き換えるときにスクリプトの目的を損なうべきではありません。

次の入力を使用すると:

A1 m4_dnl Nothing should be changed.
A2 m4___file__
m4_include([second.txt])
A4 m4___line__
A5 [` Unmatched quoting: no problem.

そして

This is second.txt, an m4 file.
The wizard said xyzzy,
and nothing happened.

「xyzzy」の「魔法」文字列を使用すると、次のような結果が得られます。

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.

libtoolizeの場合、m4_includeを使用して設定.acを使用するだけで十分です。完全なSEDスクリプトについては、以下を参照してください。https://github.com/CarloWood/cwm4/blob/master/scripts/SED.sh

編集:それだけでは十分ではないことがわかりました。また、m4をハッキングに置き換える必要がありました。https://github.com/CarloWood/cwm4/blob/master/scripts/M4.sh

おすすめ記事