如何在Bash脚本中用Sed匹配含动态哈希的Angular打包文件名?
解决Angular生产构建后Bash脚本匹配带哈希文件名的问题
我来帮你搞定这个问题!Angular生产构建给文件名加哈希确实会让原本依赖固定文件名的脚本失效,不过用Bash的通配符和一些小技巧就能轻松解决。
核心思路:用通配符匹配任意哈希值
Angular生产构建出来的文件名格式是main.随机哈希值.bundle.js,其中哈希是十六进制字符串(字母a-f+数字)。我们可以用Bash的通配符来匹配这个模式:
- 最通用的匹配:
main.*.bundle.js,*会匹配任意长度的任意字符(包括哈希) - 更精准的匹配:
main.[a-f0-9]*.bundle.js,只匹配十六进制开头的哈希,避免误匹配其他类似命名的文件
安全获取匹配文件的脚本示例
直接用ls虽然能拿到文件,但如果目录下有多个匹配文件会出问题,推荐用数组来存储匹配结果,再做检查确保唯一:
#!/bin/bash # 替换成你的Angular生产构建输出目录,比如dist/your-project-name BUILD_DIR="./dist" # 匹配符合模式的文件,用数组存储结果 MATCHED_FILES=("$BUILD_DIR/main.[a-f0-9]*.bundle.js") # 检查匹配结果 if [ ${#MATCHED_FILES[@]} -eq 0 ]; then echo "❌ 错误:找不到符合main.[a-f0-9]*.bundle.js模式的文件" exit 1 elif [ ${#MATCHED_FILES[@]} -gt 1 ]; then echo "❌ 错误:找到多个匹配文件,请检查目录:${MATCHED_FILES[*]}" exit 1 fi # 获取唯一匹配的文件路径 MAIN_BUNDLE="${MATCHED_FILES[0]}" echo "✅ 找到目标文件:$MAIN_BUNDLE" # 接下来执行你的API路径替换操作,比如用sed替换 # 注意:如果是Alpine Linux镜像,sed需要用-i''(不带空格) sed -i 's|{{API_BASE_URL}}|https://your-production-api.com|g' "$MAIN_BUNDLE" echo "✅ API路径配置完成!"
关键注意事项
- 路径正确性:确保
BUILD_DIR指向Angular生产构建的实际输出目录,默认是dist/你的项目名,别写错了! - 镜像兼容性:如果你的Docker镜像用的是Alpine Linux(轻量镜像常用),
sed命令的-i参数需要写成-i''(没有空格),否则会报错。 - 避免误匹配:用
[a-f0-9]*代替*可以更精准地匹配Angular的十六进制哈希,防止目录里其他类似命名的文件干扰。 - 健壮性检查:脚本里的长度检查很重要,能避免找不到文件或者多个文件导致的后续操作失败。
这样调整后,不管Angular构建生成的哈希是什么,脚本都能精准找到对应的文件,完美适配生产环境的构建产物!
内容的提问来源于stack exchange,提问作者efarley
相关产品推荐
相关产品推荐

