Проблема с командной строкой в ​​Perl Regex - PullRequest
9 голосов
/ 19 июня 2019

Я пытаюсь использовать отрицательный взгляд в perl в командной строке:

echo 1.41.1 | perl -pe "s/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g"

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

1.41.2

но это просто возвращает меня:

![0-9]+\.[0-9]+\.: event not found

Я пробовал его в regex101 (PCRE), и он отлично работает, поэтому я не уверен, почему он здесь не работает

Ответы [ 3 ]

6 голосов
/ 19 июня 2019

В Bash ! - это « расширение истории символ», за исключением случаев, когда экранируется обратной косой чертой или одинарными кавычками. (Двойные кавычки отключают , а не ; это означает, что расширение истории поддерживается внутри двойных кавычек. См. Разница между одинарными и двойными кавычками в Bash )

Итак, просто замените двойные кавычки на одинарные:

echo 1.41.1 | perl -pe 's/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g'

и вуаль & agrave;:

1.41.2
5 голосов
/ 19 июня 2019

Если вы хотите " увеличить " число, то вы не можете жестко закодировать новое значение, но вам нужно захватить то, что есть, и увеличить это

echo "1.41.1" | perl -pe's/[0-9]+\.[0-9]+\.\K([0-9]+)/$1+1/e'

Здесь *Модификатор 1006 * делает так, чтобы сторона замены оценивалась как код, и мы можем +1 зафиксированное число, которое затем подставляется.\K отбрасывает предыдущие совпадения, поэтому нам не нужно их возвращать;см. " Утверждения с обходом " в Расширенных шаблонах в perlre .

Иногда обходные пути - это просто то, что вам нужно, но они всегда значительно увеличивают сложность регулярного выражения (простобудучи там), может быть сложно, чтобы получить право, и повредить эффективности.Они здесь не нужны.

Странный вывод, который вы получаете, заключается в том, что двойные кавычки, используемые в программе Perl, «приглашают» оболочку посмотреть, что внутри, и интерпретирует ! как расширение истории и запускаетэто, как объясняется в посте Руаха.

4 голосов
/ 19 июня 2019

Я предполагаю, что это выражение также может работать:

([0-9.]+)\.([0-9]+)

Test

perl -e'
    my $name = "1.41.1";
    $name =~ s/([0-9.]+)\.([0-9]+)/$1\.2/;
    print "$name\n";
    '

выход

1.41.2

Пожалуйста, посмотрите демо здесь.

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