我在Perl one liner中进行了以下替换:
perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/$123424977\t/g if $. <= 200'
问题是我想在分组的正则表达式(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)
捕获的文本之后插入数字23424977。
但Perl认为我指的是团体$ 123424977!如何告诉Perl我想要组$ 1并在此之后插入文本23424977?
答案 0 :(得分:5)
您可以使用花括号明确界定变量名称 - ${1}
而不是$1
:
perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200'
答案 1 :(得分:3)
您还可以以更易读/更优雅的方式重写正则表达式:
perl -pi.bak -e 's/((?:.*?\t){9})/${1}23424977\t/g if $. <= 200'
答案 2 :(得分:2)
使用以下语法
${1}234567
答案 3 :(得分:2)
可以使用\K
标记完全取消$1
要求:
s/(?:.*?\t){9}\K/23424977/g
但使用autosplit是不是有更多的Perlish方法呢?有不止一种方法可以做到这一点,但有些方法比其他方式更方便:
$ perl -F/\t/-api.bak -e 'splice@F,9,0,23423977 if $. < 200; $_ = join "\t", @F;'
答案 4 :(得分:1)
环绕{}
perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200'
_____^ ^
答案 5 :(得分:1)
另一种方式:根本不使用群组,并将您的替换设为$&23424977\t
($&
指的是s///
运营商左侧部分匹配的全文<) / p>