Perl Regex заменить увеличение числового значения из соответствия на месте - PullRequest
0 голосов
/ 04 июля 2018

Есть ли способ регулярного выражения заменить значение на увеличенное значение +1 или +2 в Perl в одной операции регулярного выражения? Например. что-то, что меняет L001 на L002 или L003 или L004 ниже:

$ echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -lne '$_ =~ /\_L(\d{3})/; $new=sprintf("%03d",$1+1); s/\_L\d{3}/\_L$new/;print'

XYZ123-123-123x_S6_L002_R1_001.fastq.gz

Но делать это на месте в операции регулярного выражения, как показано ниже (что не работает):

echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -lne 's/\_L(\d{3})/\_$1+1/;print'

1 Ответ

0 голосов
/ 04 июля 2018

Вам нужно /e в регулярном выражении, чтобы указать 'оценивать'.

Но если вы делаете это, вы делаете оценку, поэтому вы не можете просто больше использовать голые слова. \_1+1 не является допустимым Perl. Вы можете сделать $1+1, но это даст вам 2, а не 002.

Так что вам также нужно sprintf к нулю.

И пока вы вместо этого используете конечную печать, вы можете использовать -p вместо -n.

И получите:

echo XYZ123-123-123x_S6_L001_R1_001.fastq.gz | perl -pe 's/_L(\d{3})/sprintf("_L%03d",$1+1)/e'

Что дает вам:

XYZ123-123-123x_S6_L002_R1_001.fastq.gz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...