背景
lz在写fastapi项目时候不想在Python文件里面写配置信息,开了个yaml放数据(别问,问就是写着玩)。后来在初始化的时候发现Python不能像Java一样用静态代码块,然后准备用绝对路径配置,这就带来了路径问题。
联想到最近刚开始写着玩的批处理脚本,就想写个玩玩。
雷点1
sed命令在Windows下正则表达式首尾字符标识似乎不太对劲。用形如^XXX$的方式匹配不到应该可以被匹配到的结果,后续删除^和$符号就做到了。
雷点2
遇上要替换的内容里面含有路径,路径分隔使用"\"表示,最初的替换方式为:
sed -i "s/%pattern%/%replacement%/g" "%file%"
参数与参数、参数与标识符之间都用"/"分隔,命令内又不区分斜杠与反斜杠,导致寻参异常,报错如下:
sed: -e expression #1, char 144: invalid reference \2 on `s' command's RHS
找了一些资料后发现可以这么写:
sed -i "s#%pattern%#%replacement%#g" "%file%"
雷点3
替换用的字符串里面还有路径,路径用CD命令获取,里面用反斜杠分隔目录,反斜杠仍然会被认为是命令的一部分,因此需要把"\"换成"/",这一步倒不复杂。
set "property_file=%cd%\resource\application.yaml"
set "rep=%property_file:\=/%"
完整代码
@echo off
setlocal enabledelayedexpansion
set "file=%cd%\app\config\ApplicationProperties.py"
set "property_file=%cd%\resource\application.yaml"
set "rep=%property_file:\=/%"
set "replacement=APPLICATION_PROPERTIES = YamlReader('%rep%').original_data"
@echo on
set "pattern=APP.*data"
sed -i "s#%pattern%#%replacement%#g" "%file%"
@echo done