Есть ли эквивалент для vim's \ zs в sed или perl?

11

В vim мы можем использовать \zsатом, чтобы сказать «действительно начать матч прямо здесь»:

:%s/funnyword\zs.*$/otherword/

Есть ли эквивалент для sed или даже perl?

ninrod
источник

Ответы:

15

В Perl (и PCRE) это достижимо с помощью взгляда нулевой ширины :

(?<=funnyword).*$

который соответствует «смешному слову», но не использует его как часть матча. Они работают только с текстом фиксированной длины. Вы также можете использовать отрицательный lookbehinds ( (?<!...)), чтобы указать, что некоторого текста там нет.

В любой разумно недавней версии Perl \Kпрактически точная замена того,\zs как вы ее используете:

funnyword\K.*$

\Kотбрасывает все совпадающие до сих пор, но продолжает сопоставлять с этого момента. Часть до \Kне должна быть фиксированной длины. Это также в PCRE сейчас , но я не уверен, в какой версии он появился.

\zeможет быть достигнуто с помощью взгляда нулевой ширины, используя (?=...). Этот шаблон не должен быть фиксированной длины.


Поскольку sed использует POSIX BRE , нет никакого обходного пути . В этом случае, однако, вы можете довольно легко смоделировать его, используя обычную группу захвата:

sed -e 's/\(funnyword\).*$/\1otherword/'

Вы можете сделать то же самое для позитивного взгляда. Если у вас действительно есть более сложное требование, вам, возможно, придется обратиться к Perl или к другому подходу.

Майкл Гомер
источник