2013-09-21 135 views
0

我想要替换字符串中数字的所有实例,但前提是该数字是列中空格分隔的第n列。Perl正则表达式部分替换

这是我到目前为止:

$_ =~ s/\s+([^\s]+\s+){$numcols}$i(.*)\n/$rep/; 

基本上,会有几个空格,然后会出现:(非空间(列),然后空格)$数numCols倍。然后,会有$ i,其中$ i是我想要替换的数字,后面是一些我不关心的字符和一个换行符。但是,我不想用$ rep替换ALL WITH THAT,但只有$ i。我怎么做?

+1

我认为在空间上拆分并替换结果数组的第n个元素可能会更容易。 – Jerry

+0

问题是我必须重印它,并且事先不知道需要在每列之间添加多少个空格 – user2258552

+0

请注意,您不需要指定'$ _ =〜'。这是默认设置。这就是为什么'$ _'存在的原因。 '$ _'是“it”变量。只要执行/.../..../'。 –

回答

2

事情是这样的:

$_ =~ s/^(\s+(?:[^\s]+\s+){$numcols})$i/$1$rep/; 

我们在捕捉一切$i为一组(由?:在它的中间表示的非捕获组)前。我们正在保留所有这些,仅替换$i,并将剩余的字符串单独留下。

+0

非常好,谢谢。但是,我意识到我确实在做错事。我需要通过$ i的numcols替换第0列中的EVERY实例,并使用rep,而在我刚刚替换numcolsth实例之前。此外,只是想知道,为什么这个工作,因为?:不捕捉组不会采取行动的第一个\ +? – user2258552