sed不支持非贪婪匹配 改用perl

问题

之前  Free.vps.vc 访问GitHub资源出错 用GithubProxy代理 用sed修改脚本内容

实践:

bash <(curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/v2ray_wss/raw/main/install.sh | sed -E "$(curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/gh-proxy/raw/master/sed-E-para)")

发现这个处理方法并不完美。

用grep github把涉及修改的地方输出一下。

curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/v2ray_wss/raw/main/install.sh | sed -E "$(curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/gh-proxy/raw/master/sed-E-para)" | grep github

发现,.sh 的部分,

bash <(curl -L https://github.crazypeace.workers.dev/https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh | sed -E "$(curl -L https://github.com/crazypeace/gh-proxy/raw/master/sed-E-para)" ) --version 4.45.2

只在前面加了 github proxy,后面调用 GitHub 资源的部分并没有处理。


分析

查了一下资料发现,sed只有贪婪匹配,所以改用 perl


实操

perl用来做正则替换的参数为 -pe,里面同样支持sed语法的s命令

perl -pe 's#(http.*github[^/]*/)#https://github.crazypeace.workers.dev/\1#g'

同样支持 ; 分隔多个 s 命令

不过要注意,

perl中的*是贪婪的,要用*?表示非贪婪.

perl中的$是有特殊意义的,所以要用\转义.


最终结果

https://github.com/crazypeace/gh-proxy/blob/master/perl-pe-para 的内容为

s#(curl.*?\.sh)([^/])#\1 | perl -pe "\$(curl -L https://github.com/crazypeace/gh-proxy/raw/master/perl-pe-para)" \2#g; s#(http.*?github[^/]*?/)#https://github.crazypeace.workers.dev/\1#g


修改前

bash <(curl -L https://github.com/crazypeace/v2ray_wss/raw/main/install.sh)

修改后

bash <(curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/v2ray_wss/raw/main/install.sh | perl -pe "$(curl -L https://github.crazypeace.workers.dev/https://github.com/crazypeace/gh-proxy/raw/master/perl-pe-para)")


感谢

fscarmen https://t.me/fscarmen2


评论

The Hot3 in Last 30 Days