详细代码

###############################
#
# 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. Unity C# 设计模式(五)建造者模式

    定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 组成部分: 1.Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造.这个接口规定要实现复杂对象的哪 ...

  2. Java NIO和IO的主要差别

    我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景.以及它们怎样影响您的代码设计. Java NIO和IO的主要差别 下表总结了Java N ...

  3. [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树

    链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...

  4. DNS A记录和CNAME记录

    参考文章:http://blog.xieyc.com/differences-between-a-record-and-cname-record/ A (Address) 记录是用来指定主机名(或域名 ...

  5. BZOJ 3196 线段树套平衡树

    (代码无比丑陋) //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int ...

  6. POJ 3271 BFS (大坑)

    被某人拉进了坑 完完全全被坑一天的题-- 题意: 正解思路: 先把每一个点搜一遍 预处理出它能在一步之内到的所有点 并连边 然后用一个类似DP的东西把方案数加起来就搞定了 (其实 也不是很难) 但是 ...

  7. 实时监控Cat之旅~分布式消息树的实现原理与测试

    大众点评的老吴在InfoQ上讲了Cat之后,有不少同仁开始关注这个实时监控系统,但学习的文章甚少,在GitHub上也是一言代过,给我们这些开发人员留下了N多个疑问,一时间不知道去哪里问,向谁去问了,通 ...

  8. hashCode 和 equals 方法

    hashCode 和 equals 方法 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. 使用hashCode()和 ...

  9. vue父子间通信案列三($emit和prop用法)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. IntelliJ IDEA 详细图解最常用的配置 ,适合刚刚用的新人。(转)

    IntelliJ IDEA使用教程 (总目录篇) 刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工. 比如:设置文件字体大小,代码自动完成提示,版本管理 ...