我正在尝试编写一个简单的命令行脚本来修复一些空格,并且需要使用制表符替换两个空格的出现,但前提是它出现在行的开头(仅由其他制表符作为前缀。)< / p>
我提出了s/^(\t*) /\1\t/g;
,如果我经历多次传递,它可以很好地工作,但我不知道perl知道如何循环直到字符串没有改变,或者是否有一个常规表达方式处理它。
我唯一的想法是使用lookbehind但它不能是可变长度。如果它足够短以适应快速命令行脚本,我会对非正则表达式解决方案持开放态度。
作为参考,当前的perl脚本正在执行:
perl -pe 's/^(\t*) /$1\t/g'
答案 0 :(得分:6)
您可以使用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
;