7

допустим, у меня есть файл со следующим содержанием:

Это _file_, в котором есть некоторые _special_ ключевые слова, которые я хотел бы _like_ заменить.

Я могу выполнить поиск и заменить специальные ключевые слова на «% s/_ * _/что-то», но я бы хотел, чтобы «что-то» было выводом внешней команды. Это возможно в vim, или мне нужно это включить?

3 ответа3

10

Да, ты можешь. Смотрите :help sub-replace-special ; \= позволяет заменить на выражение Vim. И system() может выполнить внешнюю команду и вернуть ее вывод. Смотрите мой тривиальный пример с hostname . Обратите внимание на то, что мне пришлось использовать substitute() чтобы избавиться от конечных символов новой строки в выводе.

:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g

PS: Я также исправил ваш шаблон регулярного выражения, чтобы он соответствовал вашему примеру.

5

В ответе Ingos, который мне очень помог, я не вижу, как ссылаться на подшаблон соответствия и использовать его в качестве аргумента для команды оболочки ("созданной консольной командой с выражением в качестве аргумента").

В моем случае у меня были строки журнала следующей формы: [<unix timestamp>] <message> , т.е. [1406844000] foobar . Я хотел добавить их со временем в удобочитаемой форме.

Следующая команда vim сопоставляет метку времени (подматрица 1) и сообщение (остальное, подспарень 2) и добавляет строку времени из команды date:

:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/

[1406844000] foobar получает Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar .

НТН

1

Для замены base64 в файле ldiff:

:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/

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