昆布大好き!

主にプログラミングの技メモ

Linux上のイージーなテキストテンプレート

やりたいこと

<!-- list.txt -->
あああ いいい ううう
かかか ききき くくく
さささ ししし すすす

みたいなリストと、

<!-- template.m4 -->
<ul>
  <li>m4_arg1</li>
  <li>m4_arg2</li>
  <li>m4_arg3</li>
</ul>

みたいなテンプレートから、

<ul>
  <li>あああ</li>
  <li>いいい</li>
  <li>ううう</li>
</ul>
<ul>
  <li>かかか</li>
  <li>ききき</li>
  <li>くくく</li>
</ul>
<ul>
  <li>さささ</li>
  <li>ししし</li>
  <li>すすす</li>
</ul>

みたいなテキスト置き換えをしたい。

【良かった方法】シェルスクリプト & sed

sedって最高だな!

#a.sh
$ sed -e s/m4_arg1/$1/ -e s/m4_arg2/$2/ -e s/m4_arg3/$3/ template.m4
cat a.list | xargs -n 3 ./a.sh

【あまり良くなかった方法】awk & m4 & シェルスクリプト

めんどかったやり方。

# a.awk
{ printf("-Dm4_arg1=%s -Dm4_arg2=%s -Dm4_arg3=%s\n", $1, $3, $2) }
$ awk -f a.awk list.txt | xargs -i echo m4 {} template.txt > a.sh
$ source a.sh

a.shの中身はこんな感じ

m4 -Dm4_arg2=あああ いいい ううう -Dm4_arg2= -Dm4_arg3= template.txt
m4 -Dm4_arg2=かかか ききき くくく -Dm4_arg2= -Dm4_arg3= template.txt
m4 -Dm4_arg2=さささ ししし すすす -Dm4_arg2= -Dm4_arg3= template.txt

字面ではこんなでもうまくいきそうだけど、 引数が思ったように処理されない。

awk -f d.awk a.list | xargs -i m4 {} template.txt
<ul>
  <li>m4_arg1</li>
  <li>あああ いいい ううう -Dm4_arg2= -Dm4_arg3=</li>
  <li>m4_arg3</li>
</ul>

<ul>
  <li>m4_arg1</li>
  <li>かかか ききき くくく -Dm4_arg2= -Dm4_arg3=</li>
  <li>m4_arg3</li>
</ul>

<ul>
  <li>m4_arg1</li>
  <li>さささ ししし すすす -Dm4_arg2= -Dm4_arg3=</li>
  <li>m4_arg3</li>
</ul>

【良くなかった方法】awk

awkのコードにテンプレートを書く。 すごくめんどい

{ printf(" \t<ul>\n\t\t<li>%s</li>\n \t\t<li>%s</li>\n\t\t<li>%s</li>\n\t</ul>\n", $1, $2, $3) }

【ダメだった方法】シェルスクリプト & tr

trはsedの代わりはできない。マルチバイトお断り。

#b.sh
cat template.txt | tr m4_arg1 $1 | tr m4_arg2 $2 | tr m4_arg3 $3
cat a.list | xargs -n 3 ./b.sh