使用包含动态哈希的文件名的bash和sed

时间:2018-02-08 21:17:03

标签: bash sed

我的应用程序中有一个bash脚本,它根据运行脚本的docker环境配置一些API路径。如果文件名是静态的,则以下代码可以正常工作,但是当Angular CLI构建应用程序的生产版本时,它会向文件名添加哈希值。我如何告诉bash脚本使用适合模式的任何文件名?例如,我如何找到文件名main.28ce25b7ef460b2617ae.bundle.js,其中哈希可以是什么?

我的脚本适用于不添加哈希值的非prod构建

#!/bin/bash
sed -i 's|placeholder_base_service_endpoint|'$BASE_SERVICE_ENDPOINT'|g' main.bundle.js

我尝试使用通配符,但由于字符串未被替换,因此它似乎无法找到该文件。

main.*.bundle.js

1 个答案:

答案 0 :(得分:0)

On Glob Expansions

如果要在赋值期间展开glob,一种方法是扩展为数组:

files=( main.*.bundle.js )

作为一些额外的偏执狂,您可能会考虑对结果数组进行完整性检查:

die() { echo "$*" >&2; exit 1; } # define a "die" function to exit if a test fails

[[ -L ${files[0]} || -e ${files[0]} ]] || die "Glob main.*.bundle.js had no matches"
(( ${#files[@]} == 1 )) || die "More than one match for main.*.bundle.js found"

如果不是断言只有一个匹配项要在sed(或其他)命令行上放置所有匹配,那么可以使用{{{ 1}}。

"${files[@]}"

请注意,在某些平台(尤其是MacOS)上,sed -i需要一个参数,提供用于备份的文件扩展名。要在这些平台上可靠地工作,传递空字符串是合适的:

sed -i

请注意,在单引号字符串结束后,在展开sed -i '' \ -e 's|placeholder_base_service_endpoint|'"$BASE_SERVICE_ENDPOINT"'|g' \ "${files[@]}" 之前会启动双引号字符串;这样我们可以避免问题,如果该字符串可以被视为一个glob或拆分成多个shell单词。

当然,BASE_SERVICE_ENDPOINT也可以是文字全球"${files[@]}"