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