详细代码

###############################
#
# Funciton: micro_template_compile
#
# Parameter:
# [1] => template :String
# [2..n] => values for placeholder as key=value
#
# Example:
# <- micro_template_compile '{code: {{error.code}}, message: "{{error.message}}"}' "error.code=127" "error.message=command not found."
# ---
# -> { code: 0, message: "" }
###############################
function micro_template_compile() { template_string="$1"; shift;
expression="" while [ $# -ne 0 ]; do
key=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\1~g')
value=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\2~g')
expression="s~{{$key}}~$value~g;$expression"
shift;
done echo "$template_string" | sed "$expression"
}

使用案例

运行

micro_template_compile 'Hi {{name}}, it is {{date}} today and {{weather}} outside. :)
message to you: {{message}}' \
  name='小王' date="$(date +"%Y/%m/%d")" weather="大晴天儿" message="咱们出去钓鱼吧。"

输出

Hi 小王, it is 2014/06/16 today and 大晴天儿 outside. :)
message to you: 咱们出去钓鱼吧!

使用到脚本中:

#!/bin/bash

#
# Usage: $exename [options] -in templatefile key=value ...
#
# Examples:
# $exename -in ./1.txt.template -out ./1.txt f1=v1 f2=v2 f3=v3
# $exename -help
# ###############################
#
# Funciton: micro_template_compile
#
# Parameter:
# [1] => template :String
# [2..n] => values for placeholder as key=value
#
# Example:
# <- micro_template_compile '{code: {{error.code}}, message: "{{error.message}}"}' "error.code=127" "error.message=command not found."
# ---
# -> { code: 0, message: "" }
###############################
function micro_template_compile() { local template_string="$1"; shift;
local expression=""
local key=""
local value="" while [ $# -ne 0 ]; do
key=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\1~g')
value=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\2~g')
expression="s~{{$key}}~$value~g;$expression"
shift;
done echo "$template_string" | sed "$expression"
} main() {
template="$(cat "$arg_in")"
eval "micro_template_compile '$template' $arg_datagroup > '$arg_out'"
return 0
} processargs() {
# defaults:
arg_in=""
arg_out="stdout"
arg_datagroup="" # arguments:
while echo "$1" | grep "^-" >/dev/null 2>&1; do
case "$1" in
-in)
arg_in="$2"; shift;
;;
-out)
arg_out="$2"; shift;
;;
esac
shift
done while [ $# -ne 0 ]; do
arg_datagroup="$arg_datagroup \"$1\""; shift;
done # exports
export arg_in arg_out arg_datagroup
} processargs "$@"
echo ""
echo "arg_in=|$arg_in|"
echo "arg_out=|$arg_out|"
echo "arg_datagroup=|$arg_datagroup|"
echo "" main

BASH 文本模版的简单实现 micro_template_compile的更多相关文章

  1. MGTemplateEngine 模版引擎简单使用(转)

    原文:http://blog.csdn.net/crazy_srufboy/article/details/21748995 要实现的效果 首先上图中间的 标题至内容 都是使用UIWebView显示, ...

  2. MGTemplateEngine 模版发动机简单使用

    https://github.com/nxtbgthng/MGTemplateEngine MGTemplateEngine 模版引擎 MGTemplateEngine比較象 PHP 中的 Smart ...

  3. Linux Bash文本操作之sed篇其二

    上一篇总结了sed的基础应用(Linux Bash文本操作之sed篇其一),内容实在有够多,这里再对稍微高级一些的用法做一个整理,以方便使用时查阅. 查看文本内容 示例1表示在第一到第四行匹配到的行后 ...

  4. iOS富文本-NSAttributedString简单封装

    直接调用系统的写起来比较麻烦,封装一下 因为要简单所以就写类方法 WJAttributeStyle 基类 ) {         ; i < styles.count; i ++) {      ...

  5. C++函数模版的简单使用

    模版算是C++的独有特性吧,也算是C++中比较难的地方,我平时开发的时候用的非常少,或者几乎没有用到,需要模版的地方是能看懂框架中相关的代码: 模版函数相对还是很简单的,引入模版的目的在于代码的重用: ...

  6. 使用java读取解析txt文本数据,管理简单的数据

    在实际开发中会经常碰到使用编程语言读取文本文件的内容,这内容可以是各种各样的一下本人写出我自己做的一个读取文本文件的例子,文件中存储的是我的个人网站 www.yzcopen.com 导航栏目因为懒得使 ...

  7. Android中的AutoCompleteTextView(随笔提示文本)组件的简单使用

    Android中的随笔提示文本组件AutoCompleteTextView的使用,此组件用于输入文本,然后就会在所配置的适配器中的数据进行查找显示在组件下面. 这里值得注意的是AutoComplete ...

  8. bash帮助文档简单学习;bash手册翻译

    关于bash的四种工作方式的不同,可以参考:http://feihu.me/blog/2014/env-problem-when-ssh-executing-command-on-remote/,但是 ...

  9. bash文本查看及处理工具

    文本查看及处理工具:     wc [OPTION] FILE...         -c: 字节数         -l:行数         -w: 单词数             who | w ...

随机推荐

  1. P2420 让我们异或吧(树链剖分)

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  2. Redis序列化存储Java集合List等自定义类型

    在"Redis学习总结和相关资料"http://blog.csdn.net/fansunion/article/details/49278209 这篇文章中,对Redis做了总体的 ...

  3. 题解 P2872 【[USACO07DEC]道路建设Building Roads】

    这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点.(也就10倍吧..) 言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已 ...

  4. ArcGIS api for javascript——地图配置-定制缩放动画

    描述 本例展示了当用户放大或缩小地图时如何定义地图的动画.zoomDuration和zoomRate是Dojo动画属性,他们确定了动画的duration和帧刷新的rate .这些属性单位是毫秒,zoo ...

  5. OpenCV图像处理篇之腐蚀与膨胀

    转载请注明出处:http://xiahouzuoxin.github.io/notes 腐蚀与膨胀 腐蚀和膨胀是图像的形态学处理中最主要的操作,之后遇见的开操作和闭操作都是腐蚀和膨胀操作的结合运算. ...

  6. HDU 5389 Zero Escape(DP + 滚动数组)

    Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  7. Android-Universal-Image-Loader 学习笔记(五)线程池分析

    UniveralImageLoader中的线程池            一般情况网络访问就需要App创建一个线程来执行(不然可能出现很臭的ANR),但是这也导致了当网络访问比较多的情况下,线程的数目可 ...

  8. BZOJ3511: 土地划分

    [传送门:BZOJ3511] 简要题意: 给出n个点,m条边,每个点有A和B两种形态,一开始1为A,n为B 给出VA[i]和VB[i],表示第i个点选择A和B形态的价值 每条边给出x,y,EA,EB, ...

  9. Java 开源博客 —— Solo 0.6.8 正式版发布了!

    Java 开源博客 -- Solo 0.6.8 正式版发布了,欢迎大家下载.另外,欢迎观摩我们的另一个产品,在线 Golang IDE--Wide! 特性 基于标签的文章分类 博客/标签 Atom/R ...

  10. idea和Pycharm 等系列产品激活激活方法和激活码

    引用自大神:雪中皓月原文链接 --------------------- 以下两种方法均可用于激活Idea,Pycharm等jetbrains系列产品第一种方法:使用现有的注册服务器优点:快捷,方便, ...