BASH 文本模版的简单实现 micro_template_compile

Posted blfbuaa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BASH 文本模版的简单实现 micro_template_compile相关的知识,希望对你有一定的参考价值。

详细代码

###############################
#
# 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 "[email protected]"
echo ""
echo "arg_in=|$arg_in|"
echo "arg_out=|$arg_out|"
echo "arg_datagroup=|$arg_datagroup|"
echo ""

main



以上是关于BASH 文本模版的简单实现 micro_template_compile的主要内容,如果未能解决你的问题,请参考以下文章

P3808 模版AC自动机(简单版)

P3808 模版AC自动机(简单版)

linux mustache bash 实现mo 做为docker容器运行动态配置工具数组的处理

Django模板语言详解

实现一个简单的虚拟DOM

[bzoj1269][AHOI2006文本编辑器editor] (splay模版题)