mojihame
名前
mojihame : テンプレートに文字をはめ込む
書式
使い方とオプション
Usage
mojihame <template> <data> (plain) mojihame -l<label> <template> <data> (line) mojihame -h<label> <template> <data> (hierarchy)
Option
-l : 行単位のデータを繰り返しはめ込む(-> 例7、8、9) -h : 階層的データをはめ込む(-> 例10、11) -n : 空文字列に置換する文字列を指定する(-> 例3) -s : 空白に置換する文字を指定する(-> 例4)
説明
引数に指定する <template> ファイルに、<data> からデータを読んで、値をはめ込みます。以下の3つの使い方があります。
- <data> の全体のフィールドを順番にはめ込む(通常)
- <data> の各行のフィールドを <template> 全体に繰り返しはめ込む、または <template> の指定ラベル間に繰り返しはめ込む(行単位)
- <data> の各行のフィールドを <template> の指定ラベル間に階層的には め込む(階層データ)
ファイル名を省略した時および “-” を指定した時は標準入力から読み込みます。<template> か <data> のいずれか一方のみを標準入力にできます。
例(その1) 通常
<template> 中にある %1 %2 %3 … の部分に、<data> のフィールド(左上から 右下に順番に %1 %2 %3 … に対応)を読んで置換します。<template> 中の %1 %2 %3 … の出現順序、回数についての制限は有りません。
$ cat template 1st=%1 2nd=%2 3rd=%3 4th=%4 $ cat data a b c d $ mojihame template data 1st=a 2nd=b 3rd=c 4th=d
例(その2) 通常(デフォルトの空白・空文字列置換機能)
デフォルトでは、<data> 中の “_” のみのフィールドは空文字列に置換され、文字列中の “_” は空白に置換されます。エスケープしてある "\_" は “_”に置換されます。
$ cat template <input type="text" value="%1" /> <input type="text" value="%2" /> <input type="text" value="%3" /> $ cat data _ usp_lab usp\_lab $ mojihame template data <input type="text" value="" /> <input type="text" value="usp lab" /> <input type="text" value="usp_lab" />
空文字列に置換する文字列は、-n オプションで変更できます。(-> 例その3)
空白に置換する文字は、-s オプションで変更できます。(-> 例その4)
例(その3) -n オプション
デフォルトでは、“_” のみの <data> 中のフィールドは空文字列に置換されます。この空文字列に置換するフィールドを -n オプションで変更できます。
$ cat template 1st=%1+ 2nd=%2+ 3rd=%3+ 4th=%4+ $ cat data USP _ _ LABO $ mojihame template data 1st=USP+ 2nd=+ 3rd=+ 4th=LABO+ $ mojihame -nUSP template data 1st=+ 2nd= + 3rd= + 4th=LABO+
-n オプションの後に文字列を指定しなかった場合には、空文字列に置換する機能は無効になります。
$ mojihame -n template data 1st=USP+ 2nd= + 3rd= + 4th=LABO+
-n オプションを指定するだけでは、“_” が空白に置換されるので、“_” をそのまま残したい場合は -s オプションを併用します。(-> 例その4)
例(その4) -s オプション
デフォルトでは、<data> 中の文字 “_” は、空白に置換されますが、空白文字に置換する文字を -s<c> オプションで変更できます。
$ cat template 1st=(%1) 2nd=(%2) 3rd=(%3) $ cat data1 usp_001 usp_002 _ $ mojihame template data1 1st=(usp 001) 2nd=(usp 002) 3rd=() # "0" を空白に置換 $ mojihame -s0 template data1 1st=(usp_ 1) 2nd=(usp_ 2) 3rd=()
エスケープしてある文字 “\<c>” は “<c>” に置換されます。
$ cat data2 usp_\0\01 usp_002 _ # エスケープしていない "0" だけを空白に置換 $ mojihame -s0 template data2 1st=(usp_001) 2nd=(usp_ 2) 3rd=()
-s オプションの後に文字を指定しなかった場合は、空白に置換する機能は無効になります。
$ mojihame -s template data1 1st=(usp_001) 2nd=(usp_002) 3rd=()
-s オプションを -n オプションと併用すると、全ての “_” をそのまま残すことができます。
$ mojihame -s -n template data1 1st=(usp_001) 2nd=(usp_002) 3rd=(_)
例(その5) –backslash オプション
このオプションを指定すると、<data> 中の文字 “\\” を “\” に変換します。これにより、<data> 中の文字 “\\_” が “\” に変換されるようになります。
$ cat template 1st=(%1) 2nd=(%2) 3rd=(%3) $ cat data \_ \\_ \\\_ $ mojihame template data 1st=(_) 2nd=(\_) 3rd=(\\_) $ mojihame --backslash template data 1st=(_) 2nd=(\ ) 3rd=(\_)
例(その6) 行単位(ラベル指定なし)
<data> は1行ずつ読み込まれ、行の各フィールドが “%1” “%2” … に対応します。次の行が読み込まれる時は、再び <template> が使用され、データがはめ込まれ出力されます。
$ cat template 1st=%1 2nd=%2 3rd=%3 4th=%4 $ cat data a b c d w x y z $ mojihame -l template data 1st=a 2nd=b 3rd=c 4th=d 1st=w 2nd=x 3rd=y 4th=z $ mojihame -r template data 1st=a 2nd=b 3rd=c 4th=d 1st=w 2nd=x 3rd=y 4th=z
<template> 中の %1 %2 %3 … の出現順序、回数についての制限は有りません。
この使い方は 旧 mojihame の -r と互換性があります。mojihame -r は将来廃止されます。
例(その7) 行単位(ラベル指定あり)
-l オプションで引数(ラベル)を指定した場合、<template> の “ラベル”で囲まれた行のみにデータが繰り返しはめ込まれます。このとき、“ラベル”を含む行は出力されません。
ラベルで挟んだ区間の前後の部分は何も変換されません。“%数字” があっても何も変換されず、そのまま出力されます。また、ラベルは開始行と終了行の2箇所のみ記述可能です。
$ cat template header %1 LABEL 1st=%1 2nd=%2 LABEL footer %2 $ cat data a b y z $ mojihame -lLABEL template data header %1 1st=a 2nd=b 1st=y 2nd=z footer %2
なお、指定した文字列を含む(部分一致する)行をラベル行と判断されますので、注意が必要です。例えば、-lLABEL を指定した場合、“xLABELx” などもラベル行と判断されます。
例(その8) 行単位(複数回適用)
mojihame -l オプションを複数回使用することで、プルダウンなどの html を簡易に生成することができます。指定ラベルは <template> 内に1組しか認められていないので、次の例のように、内側のラベルから順番に値をはめていく必要があります。
$ cat member 佐藤 鈴木 $ cat kbn1 東京 大阪 横浜 $ cat kbn2 男 女 $ cat template 氏名=%1 K1 地名=%1 K1 K2 性別=%1 K2 $ mojihame -lK1 template kbn1 | mojihame -lK2 - kbn2 | mojihame -l - member 氏名=佐藤 地名=東京 地名=大阪 地名=横浜 性別=男 性別=女 氏名=鈴木 地名=東京 地名=大阪 地名=横浜 性別=男 性別=女
例(その9) 行単位(–all オプション)
–all オプションを指定すると、すべての指定ラベルの組が認識されるようになります。この場合、指定ラベルの組で挟まれた区間が値のはめこみの対象になり、すべての区間に同じ値が適用されます。
$ cat template header %1 LABEL1 1st=%1 2nd=%2 LABEL1 ----- %1 LABEL2 1st=%1 3rd=%3 LABEL2 footer %1 $ cat data a b c x y z $ mojihame -lLABEL --all template data header %1 1st=a 2nd=b 1st=x 2nd=y ----- %1 1st=a 3rd=c 1st=x 3rd=z footer %1
例(その10) 階層データ
-h オプションは、階層的なデータをはめ込みます。“-hラベル” とラベル名を指定しなければなりません。階層ラベルは “ラベル-数字”(数字は 1, 2,3 …) の形式で <template> 中の行で指定します。
<template> において、階層的ラベルに囲まれた部分に現れる “%数字” 文字列が、<data> のフィールドに対応します。
例えば、次の例の <template> 場合、 “LABEL-1” に囲まれている部分に “%1”。 “LABEL-2” で囲まれた部分に “%1”、“%2”、“%3”。 “LABEL-3” で囲まれている部分に “%4”、“%5” があります。
このとき、<data> の指定フィールドからなるキーが変化する回数だけ、各ラベルで囲まれた部分が繰り返し値がはめられます。
なお、このような階層ラベルは <template> の中で1組しか認められません。<template> 中の %1 %2 %3 … の出現順序、回数についての制限は有りません。
$ cat template <?xml version="1.0"?> <!- LABEL-1 -> <name attr="%1"> <!- LABEL-2 -> <place name="%1" code="%2" attr="%3"> <!- LABEL-3 -> <kind>%4</kind> <time>%5</time> <!- LABEL-3 -> </place> <!- LABEL-2 -> </name> <!- LABEL-1 -> $ cat data 山田 001 東京 A 10:00 山田 001 東京 B 10:00 山田 001 大阪 C 20:00 山田 001 大阪 D 20:00 山田 001 横浜 E 09:30 山田 001 横浜 F 09:30 鈴木 002 東京 G 16:45 鈴木 002 東京 H 16:45 鈴木 002 神戸 I 15:30 鈴木 002 神戸 J 15:30 $ mojihame -hLABEL template data <?xml version="1.0"?> <name attr="山田"> <place name="山田" code="001" attr="東京"> <kind>A</kind> <time>10:00</time> <kind>B</kind> <time>10:00</time> </place> <place name="山田" code="001" attr="大阪"> <kind>C</kind> <time>20:00</time> <kind>D</kind> <time>20:00</time> </place> <place name="山田" code="001" attr="横浜"> <kind>E</kind> <time>09:30</time> <kind>F</kind> <time>09:30</time> </place> </name> <name attr="鈴木"> <place name="鈴木" code="002" attr="東京"> <kind>G</kind> <time>16:45</time> <kind>H</kind> <time>16:45</time> </place> <place name="鈴木" code="002" attr="神戸"> <kind>I</kind> <time>15:30</time> <kind>J</kind> <time>15:30</time> </place> </name>
例(その11) 階層データ(–all オプション)
–all オプションを指定すると複数組の階層ラベルを指定できます。各組の階層やキーは異なっていても構いません。
$ cat template header %1 LABEL-1 1-1 %1 LABEL-2 1-2 %1 %2 LABEL-2 1-1 %1 LABEL-1 ----- %1 LABEL-1 2-1 %1 LABEL-1 footer %1 $ cat data aaa bbb aaa ccc aaa ccc AAA bbb AAA ccc $ mojihame -hLABEL --all template data 1-1 aaa 1-2 aaa bbb 1-2 aaa ccc 1-2 aaa ccc 1-1 aaa 1-1 AAA 1-2 AAA bbb 1-2 AAA ccc 1-1 AAA ----- %1 2-1 aaa 2-1 aaa 2-1 aaa 2-1 AAA 2-1 AAA footer %1
注意
いくつかの注意事項があります。
注(その1)
-e オプションは廃止しました。(変数の受け渡しがファイルによらず、明示的になりにくいため)
注(その2) エスケープ文字の扱い
データの中の “\<c>”(<c> は空白に置換される文字)は “<c>” に置換されます。エスケープされていない “<c>” は " " に置換されます。
$ cat template %1 $ cat data ABC\nDEFnGHI\mJKL $ mojihame -sn template data ABCnDEF GHI\mJKL
デフォルトで “<c>” はアンダースコア “_” です。
-s<c> オプションで空白に置換する文字を変更できます。
-s<c> の <c> を指定しないと、空白に置換する機能は無効になります。(-> 例その4)
注(その3) 空文字列の扱い
-n<string> を指定すると、データ中に <string> と一致したフィールドがあれば、テンプレート中の対応する “%数字” にヌルデータをはめ込みます。
$ cat template X%1X $ cat data USP $ mojihame -nUSP template data XX
注(その4) 旧版との互換
旧版では、階層ラベルのサフィックス(“ラベル-数字” の “-数字”)はオプショナルでした。このため、旧版用のテンプレートではエラーになる場合が有ります。-b オプションを指定すると、このサフィックスの検査を抑止することができます。この場合、–all オプションは指定できません。
Version and Edition
Version : Tue Jun 18 19:00:37 JST 2019
Edition : 2
© 2021 Universal Shell Programming Laboratory site