提交前校验JSON键值引号前空白时grep正则无匹配如何解决?
问题原因
- 默认情况下,grep 使用基本正则表达式(BRE)语法,不支持你写的
(?=)正向肯定预查语法,这类语法属于 Perl 兼容正则表达式(PCRE)的特性,未开启对应模式时grep无法识别,因此没有返回匹配结果。 - 你测试用的命令里写的
"是HTML实体编码的双引号,本地执行命令时直接使用双引号即可,不需要用HTML转义格式,也会导致匹配失效。
解决方法
方法1:开启grep的PCRE模式(适用GNU grep,绝大多数Linux发行版默认带的版本)
添加-P参数启用PCRE支持,同时修正引号写法,如果你需要仅输出存在问题的文件名,可以额外加-l参数:
find config/*.json -exec grep -Pl '\s(?=[^"\s]*")' {} \;
方法2:使用兼容性更高的正则写法(适用所有grep版本,包括macOS自带的BSD grep)
不用预查语法,直接匹配「空白字符+末尾双引号」的组合,使用[[:space:]]匹配包括空格、制表符在内的所有空白字符,兼容性更强:
# 基础写法,输出匹配到的具体行 find config/*.json -exec grep '[[:space:]]"' {} \; # 仅输出存在问题的文件名 find config/*.json -exec grep -l '[[:space:]]"' {} \;
配置提交前自动校验
如果要把这个校验加到git提交前钩子,可直接将上述命令写入项目的.git/hooks/pre-commit文件,给文件添加可执行权限后,每次提交代码前会自动执行校验,匹配到不符合规范的JSON文件时会阻断提交。
内容的提问来源于stack exchange,提问作者TLd
相关产品推荐
相关产品推荐

