2

С этой записи от нашего crontab

1 3 1 * * find /var /log /tomcat /* -mtime +61 -type f -delete

Я хочу сопоставить 5-й пробел, чтобы отделить часть команды от части поля времени. Cron может иметь разные форматы, поэтому я хочу, чтобы DOW соответствовал солнцу или 0.

Регулярное выражение, которое я использую в vim, которое соответствует первому пробелу, заменяется на заполнитель "T".

:g/\*/s/\(\ \)\{1\}/T/

Что мне не хватает, чтобы соответствовать n-й или 5-й пробел. Это ничего не делает

:g/\*/s/\(\ \)\{5\}/T/

Я хочу создать разбивку при запуске команд в cron, чтобы попытаться сбалансировать нагрузку на наши серверы.

добавление

Я понимаю, что я делал не так с вышеуказанным поиском / заменами.

(\ \)\{5\}

Это расширяется до пяти пробелов друг за другом, а не 5-го пробела, поскольку между пробелами есть символы.

Это работает до пятого пробела, но доза замены «\1» не включает весь подобранный атом.

:g/*/s/\([0-9A-Za-z*\/,]* \)\{5}/\1 T /

после замены он оставляет следующее.

*  T find /var/log/tomcat/* -mtime +61 -type f -delete

я ищу

1 3 1 * * T find /var/log/tomcat/* -mtime +61 -type f -delete

3 ответа3

2
:g/\*/s/\(\ \)\{5\}/T/

Это не работает так, как вы хотите, поскольку в нем говорится "замените пять последовательных пробелов на T" для Vim.

Эта команда должна работать так, как вам нужно:

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+/\1T/

Смотрите :help /\v если вы не знаете, что такое "очень волшебный" режим.

1

Команда SedS предложенная Андреасом и Энди, хорошо подходит для такой вещи:

:line1,line2SedS/ \+/ T /5
0

Это регулярное выражение grep соответствует тому, что я ожидаю, и заменяет то, что я хочу.

:g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/

1 3 1 * * find /var/log/tomcat/* -mtime +61 -type f -delete

"1 3 1 * *";"find /var/log/tomcat/* -mtime +61 -type f -delete"

Спасибо xaizeks ответ.

Используя:bufdo в vim, я могу редактировать все файлы, которые у меня открыты, делая необходимые замены и, наконец, сохраняя их "| w". Таким образом, все 10 экземпляров наших серверов, которые у меня есть, теперь готовы к разборке.

:bufdo g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/|w

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .