Чи є еквівалент vim's \ zs в sed або perl?


11

У vim ми можемо використовувати \zsатом, щоб сказати "дійсно розпочати матч саме тут":

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

Чи є еквівалент sed або навіть perl?

Відповіді:


15

У Perl (та PCRE) цього можна досягти з нульовою шириною позаду :

(?<=funnyword).*$

який відповідає "смішному слову", але не споживає його як частину матчу. Вони працюють лише з текстом фіксованої довжини в майбутньому. Ви також можете скористатися негативним lookbehinds ( (?<!...)), щоб вказати, що якогось тексту немає.

У будь-якій досить недавній версії Perl - \Kце майже точний замінник\zs , який ви використовуєте:

funnyword\K.*$

\Kвідкидає все відповідне досі, але продовжує відповідати з цього моменту. Частина раніше \Kне повинна бути фіксованої довжини. Зараз це також є у PCRE , але я не впевнений, у якій версії він увійшов.

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


Оскільки sed використовує POSIX BRE , пошуку немає . У цьому випадку, проте, ви можете досить легко їх моделювати за допомогою звичайної групи захоплення:

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

Ви можете зробити те ж саме для позитивного пошуку. Якщо у вас справді є більш складна вимога, можливо, вам доведеться звернути увагу на Perl або якийсь інший підхід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.