Perl: Как вы вставляете числа после группировки переменных? - PullRequest
3 голосов
/ 21 декабря 2011

У меня есть следующая замена в Perl one liner:

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/$123424977\t/g if $. <= 200'

Проблема заключается в том, что я хочу вставить число 23424977 после текста, захваченного сгруппированным регулярным выражением (.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t).

Но Perl думает, что я имею в виду группу $ 123424977! Как мне сказать Perl, что я хочу группу $ 1 и вставить после этого текст 23424977?

Ответы [ 6 ]

5 голосов
/ 21 декабря 2011

Вы можете использовать фигурные скобки, чтобы однозначно разделить имя переменной & mdash; ${1} вместо $1:

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200'
3 голосов
/ 21 декабря 2011

Вы также можете переписать свое регулярное выражение более читабельным / элегантным способом:

perl -pi.bak -e 's/((?:.*?\t){9})/${1}23424977\t/g if $. <= 200'
2 голосов
/ 21 декабря 2011

Можно использовать флаг \K, чтобы полностью отказаться от требования $1:

s/(?:.*?\t){9}\K/23424977/g

Но не существует ли более перслистского способа сделать это с помощью автоматического разделения?Существует несколько способов сделать это, но некоторые удобнее других:

$ perl -F/\t/-api.bak -e 'splice@F,9,0,23423977 if $. < 200; $_ = join "\t", @F;'
2 голосов
/ 21 декабря 2011

используйте следующий синтаксис

${1}234567

1 голос
/ 21 декабря 2011

Другой способ: вообще не использовать группу и сделать подстановку $&23424977\t ($& относится к полному тексту, совпадающему с левой частью оператора s///)

1 голос
/ 21 декабря 2011

окружить с {}

perl -pi.bak -e 's/(.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t.*?\t)/${1}23424977\t/g if $. <= 200'
                                                               _____^ ^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...