shell实现模板字符串解析变量

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的正则就可以支持。

参考:正则表达式引擎/风味对比

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论