m4が単語の途中でマクロを置き換えるように説得する方法はありますか?
私はこのファイルday.m4が欲しい:
define(Sat,Cat)dnl
Saturday
そしてこのコマンドは:
m4 day.m4
次の出力を生成します。
Caturday
示されているように、m4はこれを行いません。
または、sedに同時に複数の置換を実行させる方法はありますか?つまり、交換するたびにファイルを渡す必要はありません。
複数のsedコマンドを一緒にリンクしたり、sedとm4の組み合わせを使用したりすることは悪くありませんが、1つの入力ファイルと1つのコマンドでこれを実行する便利な方法がある場合は、より良いでしょう。
他の一般的なツールも動作します。
私の目標は、テンプレートからファイルを作成するために使用することです。交換するトークンのほとんどはスペースで区切られます。
答え1
必要なものは次のとおりです。
sed -e sub1 -e sub2 file
ここでsubの形式は次のとおりです。
s/sat/cat/g
すべての代替エントリをファイルに入れて、次のように実行することもできます。
sed -f scriptfile filetomodify
答え2
patsubst() の使用
m4
単語内を含むどこでも置換を実行できる検索および置換機能を提供します。パタステ:
組み込み:patsubst(文字列、正規表現、[代替])
検索ひもマッチ正規表現と代替代替すべてのゲーム。
これには新しい定義設定は含まれていないため、デフォルトでは将来のすべての入力には適用できません。代わりに、関数呼び出し内の入力テキスト全体を「サンドイッチ」する必要があります。
patsubst(dnl
[...]
Saturday
[...]
,`Sat',`Cat')dnl
チェンジワード()の使用
m4も提供します言葉を変える:
処理されるファイルは、
m4
引用符付き文字列、単語(潜在的なマクロ名)、および単純トークン(その他の単一文字)に分けられます。最初に、単語は次の正規表現で定義されます。[_a-zA-Z][_a-zA-Z0-9]*
以下を使用して
changeword
この正規表現を変更できます。
残念ながら、このchangeword
機能は標準ではありません。コンパイル時に要求された場合--enable-changeword
にのみ使用できます。
有効にした後、次のことができます。m4
3文字の単語のみを許可するように強制します。
define(`Sat',`Cat')dnl
changeword(`[A-Za-z][a-z]?[a-z]?')dnl
Saturday
しかし、changeword
他の問題もあります:
正規表現目的の最終パターンの各プレフィックスは、正規表現でも許容されるという制約に従う必要があります。
[...]
語彙ルールを強化すると、一般に一部の組み込み機能が使用できなくなり、使いやすさが低下します。
dnl
上記のパターンは追加の定義を防ぎます(正確には3文字なので認識のみ可能です)。したがって、標準ではなく、目的の作業には適していません。