如何重复Perl正则表达式,直到没有更改为止?

时间:2011-03-28 12:35:08

标签: regex perl bash command-line

我正在尝试编写一个简单的命令行脚本来修复一些空格,并且需要使用制表符替换两个空格的出现,但前提是它出现在行的开头(仅由其他制表符作为前缀。)< / p>

我提出了s/^(\t*)  /\1\t/g;,如果我经历多次传递,它可以很好地工作,但我不知道perl知道如何循环直到字符串没有改变,或者是否有一个常规表达方式处理它。

我唯一的想法是使用lookbehind但它不能是可变长度。如果它足够短以适应快速命令行脚本,我会对非正则表达式解决方案持开放态度。

作为参考,当前的perl脚本正在执行:

perl -pe 's/^(\t*)  /$1\t/g'

4 个答案:

答案 0 :(得分:6)

检查a very similar question

您可以使用1 while s/^(\t*) /$1\t/g;重复该模式,直到没有任何更改为止。

答案 1 :(得分:3)

perl -pe 's{^(\t*)((  )+)}{$1 . "\t" x (length($2)/length($3))}e'

答案 2 :(得分:1)

支持空格和制表符的混合:

perl -pe'($i,$s)=/^([ \t]*)([.*])/s; $i=~s/  /\t/g; $_="$i$s";'

答案 3 :(得分:0)

这是Perl,所以你不必做循环。相反,您可以在替换表达式中进行评估,如下所示:

my $tl = 4;
s{ ( \t* ) ( [ ]* ) }
 { my $l=length( $2 ); 
   "$1" . ( "\t" x int( $l / $tl )) . ( ' ' x ( $l % $tl ))
 }ex
;