використовуючи vims pattern-multi-items {n}, щоб відповідати 5-му простору рядка


2

З цим вступом з нашого кронтаба

1 3 1 * * Знайти / var / log / tomcat / * -mtime +61-тип f-видалити

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

Регулярний вираз, який я використовую у vim, що відповідає першому простору, замінює на місце "T".

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

Що мені не вистачає, щоб відповідати n або 5 місцям. Це нічого не робить

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

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

Додаток

Я розумію, що я роблю неправильно з вищезазначеним пошуком / замінами.

(\ \)\{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

Відповіді:


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

Це не працює, як ви хочете, тому що він говорить "замінити п'ять послідовних просторів з T" на Vim.

Ця команда повинна працювати так, як вам потрібно:

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

Подивитися :help /\v якщо ви не знаєте, що таке "дуже магічний" режим.


: g / * / s / ^ v (s + (+) + +) {4} S +) s + (. *) / "1"; "" 3 "/ тепер створює те, що я шукаю . "1 3 1 * ";" знайти / var / log / tomcat / -mtime +61 -тип f -delete "
nelaaro

1

The SedS команду запропонував Андреас і Енді добре підходять для такого роду речей:

:line1,line2SedS/ \+/ T /5

покласти цілу функцію на vim, щоб імітувати sed, це трохи більше, ніж вбивати. Але це працює.
nelaaro

0

Це grep regex відповідає тому, як я очікую, і замінює спосіб, яким я хочу це зробити.

: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 копій, які я маю з наших серверів cron робочих місць, тепер готові до витягання розбираються.

:bufdo g/\*/s/^\v(\s*(\S+\s+){4}\S+)\s+(.*)/"\1";"\3"/|w
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.