我正在尝试创建 bash 脚本来检查我的源代码以标记绝对 url,因为我们所有的开发人员在涉及内部链接时都应该使用相对 url。
我正在考虑创建一个 bash 脚本,然后可以将其作为我们预提交挂钩的一部分包含在内,因此使用 git grep 似乎也合乎逻辑。我一切正常,但是,我在使用 git grep 的正则表达式时遇到了一些困难。
这是我到目前为止所拥有的:
`# Set's the regex test & files
readonly FORBIDDEN_RE="\((\|'\|\"\)\(http\|https\):\/\/\(www\.\)\?example\.com"
readonly FORBIDDEN_FILES="'*.md' '*.html' ':!README.md'"
# Adds double quotes around regex since without them git grep doesn't work,
# However, even trying to put the re_test variable in place of FORBIDDEN_RE
# is not working in the actual git grep.
# re_test="\"""$FORBIDDEN_RE""\""
if [ "$(git grep -n --cached -i -e "$FORBIDDEN_RE" -- "$FORBIDDEN_FILES")" != 0 ]; then
git grep -n --cached -i -e "$FORBIDDEN_RE" -- "$FORBIDDEN_FILES"
echo "ERROR: You're trying to make a commit that contains a hardcoded internal URL. Please make it relative."
exit 1
fi`
这是我正在做的测试,如果我希望它们被正则表达式标记:
http://www.example.com
- 未标记
(http://www.example.com
- 标记(我们使用降价,所以这将是降价文件中的链接)
"http://www.example.com
- 已标记(因为双引号表示这可能在 href 值中)
'http://www.example.com
- 标记(因为这也可能表示 URL 在 href 值中)
http://example.com
- 未标记
(http://example.com
- 标记
"http://example.com
- 标记
'http://example.com
- 标记
(http://example.com?param=abc
- 标记
"http://example.com?param=abc
- 标记
'http://example.com?param=abc
- 标记
(http://subdomain.example.com
- 未标记
仅使用命令行
对我最有效的是:git grep -n --cached -i -e "\((\|'\|\"\)\(http\|https\):\/\/\(www\.\)\?example\.com" -- '*.html' '*.md' ':!README.md'
但是,由于我必须做的所有字符转义并在 bash 文件中执行此操作时尝试在正则表达式周围获取引号,我似乎无法在 bash 文件中使其工作。
我回显出什么$FORBIDDEN_RE
是值,它似乎正在删除\"
第一个捕获组中正在寻找“(”、单引号或双引号的值。这是$FORBIDDEN_RE
我回显时的值:
git grep -n --cached -i -e "\((\|'\|"\)\(http\|https\):\/\/\(www\.\)\?example\.com" -- '*.md' '*.html' ':!README.md'
有什么想法我做错了什么,或者如何使正则表达式更容易与 git grep 一起使用?