vim заменяет раздел расписания crontab - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу заменить, например, */5 * * * * в crontab чем-то другим (в моем случае я скопировал весь crontab в файл и хочу полностью удалить эти разделы, чтобы сделать его исполняемым в виде сценария оболочки) Я попытался, например, так:

:%s/*\/5 * * * *//g -> заменяет только часть */5, но оставляет * * * *

Может кто-нибудь помочь мне здесь, пожалуйста?

1 Ответ

0 голосов
/ 21 ноября 2018

{pattern} в :help :substitute является регулярным выражением;Вы не можете просто вставить текст поиска буквально как есть, но должны экранировать материал.В частности, в вашей команде есть две проблемы:

  • Вы используете / разделитель по умолчанию в :substitute, но у вас также есть этот символ внутри шаблона (*/5).* / либо необходимо экранировать (\/), либо вам нужно выбрать другой разделитель (подойдет любой не алфавитно-цифровой символ ASCII, не являющийся пробелом, например, :%s#...#...#g).
  • * является мультипунктом (:help /star);если он не экранирован, он не соответствует самому себе, но указывает на кратность предыдущего атома.Опять же, вы можете либо экранировать каждый экземпляр (\*), либо переключить все регулярное выражение в режим, который называется «очень номагическим» в Vim, что означает, что большинство символов теряют свое особое значение и воспринимаются буквально (за исключением обратной косой черты), от которого еще нужно сбежать);:help /\V
  • Поскольку вы ожидаете, что шаблон появится в строке только один раз, вы можете сбросить флаг /g.Чтобы закрепить рисунок еще больше, вы можете добавить якорь «начало линии» (^) спереди.Это не критично, но предотвращает непреднамеренные совпадения.
  • Если вы сейчас спрашиваете, почему этот синтаксис регулярных выражений настолько усложняет ситуацию (буквальный поиск будет намного проще), это не так.Сила регулярных выражений позволяет значительно упростить.Например, повтор * может быть переписан как \( \*\)\+ (повторение произвольно) или \( \*\)\{4} (ровно четыре раза).(Хотя я бы не советовал это с вашим примером, так как это усложнило бы его и не спасло бы от набора текста.)

Итак, вот два варианта (экранирование / другой разделитель и очень кочевойрежим):

:%s/\*\/5 \* \* \* \*//
:%s#\V*/5 * * * *##
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...