搜索并替换Bash

时间:2014-04-17 15:33:31

标签: bash awk

我有一个类似需要解析的mustache模板文件。 e.g。

abc def ghijk{{ var1 }} lmno {{ var2 }} pq
rst={{ var3 }} uvwzyx

{{ var1 }}之类的变量需要替换为具有相同名称的变量,该变量已在bash脚本中预先定义,例如var1="foobar"

我正在考虑使用while readawk来完成此任务,但不知道在这种情况下执行字符串操作的正确方法是什么。

提前致谢!

4 个答案:

答案 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

使用略有不同,它还支持其他胡须功能,如部分或数组。