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

В моем случае эта ошибка вызывалась при запуске «yum update» из-за локального репозитория, который я вручную добавил в каталог /etc/yum.repo.d .

Я создал файл myrepo.repo и в строке «baseurl» дважды ввел «http: //», то есть:

baseurl = http: // http: //isblcncldrp0001.scisb.isban.corp : 8900 / cm / 5 /

Итак, как видите, baseurl неверен. Я удалил лишние «http: //», и «yum update» прошло успешно.

10
29.12.2016, 02:58
1 ответ

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

(?<=funnyword).*$

который соответствует "funnyword", но не использует его как часть соответствия. Они работают только с текстом фиксированной длины в lookbehind. Вы также можете использовать отрицательные lookbehinds ((?), чтобы указать, что некоторый текст отсутствует.

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

funnyword\K.*$

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

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


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

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

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

17
27.01.2020, 20:01

Теги

Похожие вопросы