详细代码

###############################
#
# 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. numpy基础篇-简单入门教程2

    import numpy as np Array 数组 print(np.zeros((2, 2))) # [[0. 0.] [0. 0.]] print(np.ones((2, 2))) # [[1 ...

  2. Win10平台下通过VMware虚拟机安装Win7、Ubuntu、Mac

    1.安装VMware14.1.1 下载地址:https://download.csdn.net/download/jasonczy/10611423 产品秘钥: CG54H-D8D0H-H8DHY-C ...

  3. HDFS 文件系统流程图。PB级文件存储时序图。

    大小文件通吃, 热点hash功能. 全局唯一KV索引. 百度网盘模式.断点续传功能.MR分析功能. 来自为知笔记(Wiz)

  4. Codeforces 701A. Cards(水)

    A. Cards time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  5. css3 实现动画效果

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

  6. 51nod 最长公共子序列+输出路径

    当x = 0 或 y = 0时 f[x][y] = 0 当a[x] = b[y]时  f[x][y] = f[x-1][y-1]+1 当a[x] != b[y]时 f[x][y] = max(f[x] ...

  7. OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

    在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码. 顿时发现枚举类竟然也有如此"高端大气上档次"的用法. 沙场点兵(用法源码) com.sun.tools. ...

  8. OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计

    前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...

  9. react-native-swiper苹果正常显示,Android不显示

    在使用react-native-swiper时,最好不要放到(FlatList , SectionList,ListView,ScrollView 等)组件中,否则Android 可能不会正常显示图片 ...

  10. NumPy基础入门学习

    对于习惯使用了MATLAB的用户而言,学习NumPy这个python工具包付出的成本应该是不大的. NumPy的基本的object是多维数组,是一个有同样类型的数字等构成的一张表格,能够通过元组进行索 ...