Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

テキスト処理ツールm4はシェルスクリプトでテンプレートエンジン的に扱える

slimやjadeのようなテンプレートエンジンを使うとHTMLの一部を置き換えしたりできます。
シェルスクリプトでコレを実現する場合、私はいままでgrepだのsedだのawkだのをブンまわしていました。

さて、ここで昔から使われいるテキスト処理ツールのm4が登場します。
やってる事はテキストのルールベースの置き換えなので、sedの強化版とでもいうべきか……。
パイプ処理ならSlimやJadeでも可能ですが、タグベース以外にも普通のテキストファイルの編集も可能。

実際のところ

環境構築

WSLは素の環境でGNU版が入っていました。

$ m4 --version
m4 (GNU M4) 1.4.18
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Rene' Seindal.

どういう訳かない場合も標準的環境ならば以下で導入ができるかと。

$ sudo apt upgrade
$ sudo apt install m4

使い方

単純な置き換え

これだけではsedawkと変わりませんが

$ echo "Hello, World" | m4 -D Hello=ByeBye 
ByeBye, World
文字列に応じた操作

マッチした値は"$0"のような感じで格納される

$ echo "Hello, World" | m4 -D Hello="len($0)"
5, World

合わせ技で。
マッチは大文字小文字の判定あり。

$ echo "Hello, hello, Hello" | m4 -D Hello="len($0)"
5, hello, 5
シェルコマンドの実行

目的であるテンプレートエンジン的な使いかた
引数にファイル名をとり、独自コマンドをパイプで渡して、それをcatでキャッチして実行というながれ

$ function HELLOWORLD () {  echo -n 1234; }

$ cat basetext.txt
Hello, World
$ HELLOWORLD | m4 -D Hello="syscmd(cat)" basetext.txt
1234, World