mojihame

提供: Personal Tukubai for Academic
2021年6月7日 (月) 08:37時点におけるPt4a editor (トーク | 投稿記録)による版 (Batch Update)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

名前

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つの使い方があります。

  1. <data> の全体のフィールドを順番にはめ込む(通常)
  2. <data> の各行のフィールドを <template> 全体に繰り返しはめ込む、または <template> の指定ラベル間に繰り返しはめ込む(行単位)
  3. <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