В vim мы можем использовать \zs
атом, чтобы сказать «действительно начать матч прямо здесь»:
:%s/funnyword\zs.*$/otherword/
Есть ли эквивалент для sed или даже perl?
источник
В vim мы можем использовать \zs
атом, чтобы сказать «действительно начать матч прямо здесь»:
:%s/funnyword\zs.*$/otherword/
Есть ли эквивалент для sed или даже perl?
В Perl (и PCRE) это достижимо с помощью взгляда нулевой ширины :
(?<=funnyword).*$
который соответствует «смешному слову», но не использует его как часть матча. Они работают только с текстом фиксированной длины. Вы также можете использовать отрицательный lookbehinds ( (?<!...)
), чтобы указать, что некоторого текста там нет.
В любой разумно недавней версии Perl \K
практически точная замена того,\zs
как вы ее используете:
funnyword\K.*$
\K
отбрасывает все совпадающие до сих пор, но продолжает сопоставлять с этого момента. Часть до \K
не должна быть фиксированной длины. Это также в PCRE сейчас , но я не уверен, в какой версии он появился.
\ze
может быть достигнуто с помощью взгляда нулевой ширины, используя (?=...)
. Этот шаблон не должен быть фиксированной длины.
Поскольку sed использует POSIX BRE , нет никакого обходного пути . В этом случае, однако, вы можете довольно легко смоделировать его, используя обычную группу захвата:
sed -e 's/\(funnyword\).*$/\1otherword/'
Вы можете сделать то же самое для позитивного взгляда. Если у вас действительно есть более сложное требование, вам, возможно, придется обратиться к Perl или к другому подходу.