shell实现模板字符串解析变量
今天本来打算写一个v2ray转clash配置文件的shell脚本,由于两者的关键参数是一致的,只是格式不同。我首先想到的是使用模板字符串来解析变量。
上图中是原本的v2ray客户端的格式,下面的是clash客户端需要的格式。
我的代码实现如下:
#!/bin/bash trojanArray=(Type Password Domain Port Name) template=' - {"type":${Type},"name":${Name},"server":${Domain},"password":${Password},"port":${Port},"udp":true,"skip-cert-verify":true}' regex="(.*?)://(.*?)@(.*?):([0-9]+)#(.*)" echo -e \ " trojan://nsTcmFBI@domain.com:443#HK1 trojan://MTYqeRsx@domain.com:443#HK3 trojan://BAuSxaiw@domain.com:443#HK0 trojan://GwZOlMiB@domain.com:443#JP1 " | while read line; do if [[ $line =~ $regex ]]; then for i in ${!trojanArray[@]}; do eval "${trojanArray[$i]}=${BASH_REMATCH[$i+1]}" done eval "cat <<EOF $template EOF" fi done
我的思路大致有以下几点:
- 将变量名放到数组中作为字面量,后面通过eval实现动态赋值。
- 使用bash正则内置变量BASH_REMATCH获取匹配的关键字。
- 通过eval $template 给模板字符串赋值。
然后问了下学津大佬的思路,我跪了。
一行顶我几十行,大佬就是大佬,望尘莫及。学津大佬YYDS!
补充一些使用过程中遇到的问题:
bash内置的正则默认是不支持 [\d]+ 这种写法的。这里以grep为例。
- -E, –extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
- -G,–basic-regexp 将PATTERN解释为基本的正则表达式(BRE),这是默认设置
- -F, –fixed-strings PATTERN 是一组换行符分隔的字符串
- -P, –perl-regexp PATTERN 是一个 Perl 正则表达式
所以本身的正则是不支持的,而使用perl的正则就可以支持。
参考:正则表达式引擎/风味对比
赞赏微信赞赏支付宝赞赏
发表评论