我有一个类似需要解析的mustache模板文件。 e.g。
abc def ghijk{{ var1 }} lmno {{ var2 }} pq
rst={{ var3 }} uvwzyx
{{ var1 }}
之类的变量需要替换为具有相同名称的变量,该变量已在bash脚本中预先定义,例如var1="foobar"
。
我正在考虑使用while read
和awk
来完成此任务,但不知道在这种情况下执行字符串操作的正确方法是什么。
提前致谢!
答案 0 :(得分:2)
export var1="duper"
export var2="tester"
export var3=1231
sed -e 's/{{ *\([^} ]*\) *}}/$\1/g' -e 's/^/echo "/' -e 's/$/"/' input | sh
给出:
abc def ghijkduper lmno tester pq
rst=1231 uvwzyx
答案 1 :(得分:1)
这是一个所有awk版本,需要替换的key = value对文件。如果我创建一个vars
文件,如:
var1 =foobar
var2 =elf
var3 =monkey data
我被欺骗的地方#34;并在数据文件中包含与vars关联的空格。然后我制作了一个可执行的awk文件,如:
#!/usr/bin/awk -f
BEGIN {FS="="}
NR==FNR {vars[$1]=$2; next}
set_delims==0 {FS="[{][{]|[}][}]"; $0=$0; set_delims=1 }
{
for(i=1;i<=NF;i++) {
printf( "%s%s", ($i in vars) ? vars[$i] : $i, i==NF?"\n":"")
}
}
如果可执行awk文件被调用awko
,则可以像awko vars data
一样运行:
abc def ghijkfoobar lmno elf pq
rst=monkey data uvwzyx
答案 2 :(得分:0)
要以可扩展的方式执行此操作(要扩展许多宏),您可能希望研究使用宏处理器。考虑到GNU m4,虽然它只允许宏名称中包含字母数字和_
字符,因此对于此特定任务可能会非常棘手。
为了帮助您入门,您可以使用sed
使用此sed脚本执行替换(我称之为mustache.sed):
s/{{ var1 }}/foobar/g
s/{{ var2 }}/bazbar/g
s/{{ var3 }}/quxbar/g
与您的示例一起使用:
$ sed -f mustache.sed mustache.txt
abc def ghijkfoobar lmno bazbar pq
rst=quxbar uvwzyx
$
您可以将此sed脚本全部放在一个sed命令行上,但我认为使用该脚本会使其更具可读性。
答案 3 :(得分:0)
我最近遇到了类似的问题,并在bash中发现了这个很好的小胡子实现:https://github.com/tests-always-included/mo
如果你已经在当前的bash上下文中定义了所有变量,那就像调用:
一样简单./mo template.file
使用略有不同,它还支持其他胡须功能,如部分或数组。