repeat.sh テンプレートにデータを埋め込んで繰り返す coneta #4
repeat.sh
文字列を置換しながら繰り返すbashのスクリプトです。
機能
- 固定部と可変部からなるテンプレートの可変部をリスト形式のデータで置換する。データが複数ある場合は、区切り文字列を付加しながら置換を繰り返す。結果は
stdout
に出力する。
- ヘッダ文字列とフッタ文字列を結果の前後に出力することも可能。
- テンプレートの固定部、ヘッダ文字列、フッタ文字列および区切り文字列は
printf
コマンドのエスケープシーケンスが使用可能。
使用方法
stdout
に出力する。printf
コマンドのエスケープシーケンスが使用可能。【呼び出し形式】
__HD__="ヘッダ文字列" __FT__="フッタ文字列" repeat.sh 'テンプレート' '区切り文字列' '被置換文字列のリスト' 'データのリスト#1' 'データのリスト#2' ... 'データのリスト#n'
【パラメータの説明】
パラメータ | 内容 | 備考 |
---|---|---|
環境変数__HD__
|
ヘッダ文字列 | 省略可 |
環境変数__FT__
|
フッタ文字列 | 省略可 |
第1引数 | テンプレート文字列 | |
第2引数 | 区切り文字列 | |
第3引数 | 被置換文字列のリスト |
bash のリスト形式、( と) で囲む |
以降の引数 | データのリスト |
bash のリスト形式、( と) で囲む |
【実行例】
__HD__="CREATE TABLE tbl001 (\n" __FT__="\n);\n" repeat.sh ' @1@\t @2@' ",\n" '(@1@ @2@)' '("i1" "int")' '("i2" "int")' '("vc1" "varchar(80)")' '("vc2" "varchar(80)")'
パラメータ | 値 |
---|---|
ヘッダ文字列 | __HD__="CREATE TABLE tbl001 (\n" |
フッタ文字列 | __FT__="\n);\n" |
本スクリプト | repeat.sh |
テンプレート文字列 | ' @1@\t @2@' |
区切り文字列 | ",\n" |
被置換文字列のリスト | '(@1@ @2@)' |
データのリスト | '("i1" "int")' |
データのリスト | '("i2" "int")' |
データのリスト | '("vc1" "int")' |
データのリスト | '("vc1" "varchar(80)")' |
データのリスト | '("vc2" "varchar(80)")' |
【実行結果】
CREATE TABLE tbl001 (
i1 int,
i2 int,
vc1 varchar(80),
vc2 varchar(80)
);
実装
repeat.sh
#/bin/bash
template=$1
delimiter=$2
defs=$3
shift 3
sd=$(echo -n -e '\x04')
eval adefs="${defs}"
for data in "${@}"
do
adata=("${adata[@]}" "${data}")
done
printf "${__HD__}"
dlmt=""
for a in "${adata[@]}"
do
line=$({
printf "sed '"
eval aa="${a}"
for ((i=0;i<${#aa[@]};i++))
do
printf "s${sd}%s${sd}%s${sd}g\n" "${adefs[i]}" "${aa[i]}"
done
printf "' <<< '%s'" "${template}"
}|bash)
printf "${dlmt}"
printf "${line}"
dlmt=${delimiter}
done
printf "${__FT__}"
環境
repeat.sh
#/bin/bash
template=$1
delimiter=$2
defs=$3
shift 3
sd=$(echo -n -e '\x04')
eval adefs="${defs}"
for data in "${@}"
do
adata=("${adata[@]}" "${data}")
done
printf "${__HD__}"
dlmt=""
for a in "${adata[@]}"
do
line=$({
printf "sed '"
eval aa="${a}"
for ((i=0;i<${#aa[@]};i++))
do
printf "s${sd}%s${sd}%s${sd}g\n" "${adefs[i]}" "${aa[i]}"
done
printf "' <<< '%s'" "${template}"
}|bash)
printf "${dlmt}"
printf "${line}"
dlmt=${delimiter}
done
printf "${__FT__}"
ホスト Windows10 COREi7
VM VirtualBox バージョン 5.2.8 r121009 (Qt5.6.2)
CentOS Linux release 7.4.1708 (Core)
3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
sed (GNU sed) 4.2.2
Author And Source
この問題について(repeat.sh テンプレートにデータを埋め込んで繰り返す coneta #4), 我々は、より多くの情報をここで見つけました https://qiita.com/EjiriAkira/items/bd24356a8a1829769639著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .