Perl正则匹配失败求助:Regex101可用但脚本中无法匹配
问题排查与解决
你的Perl正则在脚本中无法匹配的核心原因是bash变量传递时的转义问题,以及换行符的处理差异,具体分析和修复如下:
关键问题点
换行符变量定义错误
你在bash中定义LINE_BREAK='\n',这会被当作字面量字符串\n传递给Perl,而非实际的换行符。但在Regex101中你使用的是真实换行,两者匹配逻辑完全不一致。bash对正则中
$的解析干扰
正则里的$(比如[^{]+{$\n中的行尾匹配符$)在bash中会被解析为变量引用,导致传递给Perl的正则表达式被破坏,失去行尾匹配的作用。Perl的
-l参数冲突-l参数会自动为输入输出添加/去除换行符,干扰你手动处理的换行匹配逻辑,导致正则无法正确识别行结构。
修复方案
方案1:修正变量传递与正则写法
直接在Perl正则中使用\n,避免通过bash变量传递,同时调整函数写法规避转义问题:
perlRegex(){ PERL_BADLANG=0 perl -e ' my $string = shift; my $pattern = shift; my $replace = shift; $string =~ s/$pattern/$replace/gm; print $string; ' "$1" "$2" "$3" } # 直接使用Perl原生\n,避免bash转义干扰 EDITED=$(cat file.txt); EDITED=$(perlRegex "${EDITED}" '(?<=\n)( +)([^{]+{$\n)([^\s][^;]+;$)' '$1$2$1$1$3')
方案2:简化脚本逻辑(更推荐)
如果不需要复用perlRegex函数,直接用单条Perl命令处理,彻底规避bash变量传递的麻烦:
EDITED=$(PERL_BADLANG=0 perl -0777 -pe 's/(?<=\n)( +)([^{]+{$\n)([^\s][^;]+;$)/$1$2$1$1$3/gm' file.txt)
-0777:让Perl读取整个文件作为单个字符串,支持跨多行匹配-pe:自动遍历处理并打印结果,省去手动赋值和打印的冗余逻辑
验证测试
用你的示例输入测试修正后的脚本,会得到预期的缩进对齐结果:
if (debug) { Tools.DebugLine("Log"); }
内容的提问来源于stack exchange,提问作者Randommm
相关产品推荐
相关产品推荐

