Shell脚本中用正则匹配指定区间字符并修正.env格式问题
问题解决:修复GRAPHQL_URL格式错误及正则匹配说明
核心问题原因
你之前全局替换所有:为=,导致URL中的https://被改成https=//;之前sed报错\1未定义,是因为未启用扩展正则(或基础正则分组未加转义),导致分组引用失效。
直接修复命令
1. 基础兼容版(适配所有POSIX sed)
只把https=改回https:,直接处理文件:
sed 's/https=/https:/' your_file.env
要原地修改文件,加-i参数:
sed -i 's/https=/https:/' your_file.env
2. 精准匹配版(仅修改GRAPHQL_URL行)
避免误改其他行的类似字符串:
sed '/^GRAPHQL_URL=/ s/https=/https:/' your_file.env
解释:/^GRAPHQL_URL=/锚定以GRAPHQL_URL=开头的行,仅对这类行执行替换操作。
3. 通用协议版(支持http/https)
如果需要兼容http协议,用扩展正则(GNU sed默认支持,BSD sed加-E):
sed -E 's/(https?)=/\1:/' your_file.env
若用基础正则(无-E),分组需加转义:
sed 's/\(https?\)=/\1:/' your_file.env
完整流程优化(从JSON到.env一步到位)
直接用jq生成KEY=VALUE格式,避免先替换所有:再修复的麻烦:
curl -s "你的配置接口地址" | jq -r 'to_entries[] | "\(.key)=\(.value)"' > .env
解释:jq -r 'to_entries[] | "\(.key)=\(.value)"'会直接把JSON键值对转成.env格式,从根源避免URL被错误修改。
正则匹配指定字符串间目标字符的思路
要匹配两个特定字符串之间的目标字符,核心是锚定+分组捕获:
- 先写前置锚定字符串(比如
GRAPHQL_URL=或https) - 用分组
()捕获需要保留的内容(避免替换时丢失) - 匹配要修改的目标字符(比如
=) - 替换时通过
\1(扩展正则)或\1(基础正则需加转义\( \))引用捕获的内容,只修改目标字符
示例:
- 仅替换
GRAPHQL_URL=和//之间的=:
sed -E 's/(GRAPHQL_URL=https)=/\1:/' your_file.env
- 替换任意协议与
//之间的=:
sed -E 's/([a-zA-Z]+)=\/\//\1:\/\/' your_file.env
内容的提问来源于stack exchange,提问作者seven
相关产品推荐
相关产品推荐

