Как сделать подстановки в строке только после определенного якоря? - PullRequest
0 голосов
/ 17 октября 2019

Как сделать замены в строке только после определенного якоря?

Мне нужно:

xtop.xnext.sig1 --> xtop.xnext-sig1
xtop.xnext.xlower.sig2 --> xtop.xnext-xlower-sig2

С элегантным s/// в Perl. Есть ли классный способ сделать это, используя xtop.xnext в качестве привязки (т. Е. Все '.' -> '-', но только после xtop.xnext), вместо того, чтобы сначала сопоставить, а затем прошить, используя несколько команд?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Это работает:

perl -p -e 's/(?:xtop\.xnext|\G)\K\.([^.]+)/-$1/g;'

(?:  -- grouping only, don't create backref
xtop.\xnext|\G   -- explicit text or position of last match
\K     -- match from this position only
\.     -- match the period
([^.]+)   -- capture for the purpose of the \G to be used later
1 голос
/ 17 октября 2019

Вот один подход, использующий сначала совпадение для установки начальной позиции с использованием флага g, который устанавливает свойство pos $str, которое позже может быть использовано с утверждением \G для начала поиска сзаданная позиция:

if ( $str =~ /xtop\.xnext/g ) {
    $str =~ s/\G[^.]*\K\./-/g;
}

См. perldoc perlre для получения дополнительной информации.

...