You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl正则匹配失败求助:Regex101可用但脚本中无法匹配

问题排查与解决

你的Perl正则在脚本中无法匹配的核心原因是bash变量传递时的转义问题,以及换行符的处理差异,具体分析和修复如下:

关键问题点

  1. 换行符变量定义错误
    你在bash中定义LINE_BREAK='\n',这会被当作字面量字符串\n传递给Perl,而非实际的换行符。但在Regex101中你使用的是真实换行,两者匹配逻辑完全不一致。

  2. bash对正则中$的解析干扰
    正则里的$(比如[^{]+{$\n中的行尾匹配符$)在bash中会被解析为变量引用,导致传递给Perl的正则表达式被破坏,失去行尾匹配的作用。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:51:53