perl 如何在正则表达式替换中使用的字符串中重复字符n次?

kq0g1dla  于 2023-10-24  发布在  Perl
关注(0)|答案(3)|浏览(144)

如何在替换中使用的字符串中重复字符n次?
我想做的事情如下:

$numOfChar = 10;

s/^\s*(.*)/' ' x $numOfChar$1/;
envsm3lx

envsm3lx1#

默认情况下,替换会将一个字符串作为要替换的部分。要在替换过程中执行代码,必须使用e标志。

$numOfChar = 10;

s/^(.*)/' ' x $numOfChar . $1/e;

这将在文本的开头添加$numOfChar空间。要对文本中的每一行执行此操作,请使用-p标志(用于快速的单行处理):

cat foo.txt | perl -p -e "$n = 10; s/^(.*)/' ' x $n . $1/e/" > bar.txt

或者如果它是一个较大的脚本的一部分,使用-g-m标志(-g用于全局,即重复替换,-m用于使^在每行的开头匹配):

$n = 10;
$text =~ s/^(.*)/' ' x $n . $1/mge;
eivnm1vs

eivnm1vs2#

正则表达式可以写成:

$numOfChar = 10;

s/^(.*)/(' ' x $numOfChar).$1/e;

但是-你可以这样做:

s/^/' ' x $numOfChar/e;

或者根本不使用regexp:

$_ = ( ' ' x $numOfChar ) . $_;
yr9zkbsy

yr9zkbsy3#

你是对的,Perl的x运算符会多次重复一个字符串。

print "test\n" x 10; # prints 10 lines of "test"

要在正则表达式中实现这一点,最好(也就是大多数维护人员友好的)将值分配给另一个变量。

my $spaces = " " x 10;
s/^\s*(.*)/$spaces$1/;

有很多方法可以在不使用额外变量的情况下实现它,但如果这样做,它只是我的0.02美元,那么维护起来会更容易。

相关问题