Как объединить: vim и: s в vim - PullRequest
0 голосов
/ 24 декабря 2011

Например, у меня есть задача найти все файлы в текущем каталоге, где содержится «foo», а затем заменить на «bar».
Теперь вот мое текущее решение:
:vim /bar/ **/*
Используйте это для поиска всех появлений foo, а затем замените его один за другим на "bar"
:s/foo/bar/gc
Очевидно, что это не хорошее решение, когда замены становятся большими. Так что, если есть лучшее решение, объедините эти две операции в одну. Но есть предварительное условие: перед заменой нужно дать подсказку, как это делает c во второй команде. Это предотвращает замену некоторых слов, которые не нужно заменять.

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

Открыть все файлы в vim:

$ vim *

Заменить foo на bar

:argdo %s/foo/bar/ | update

Учебник: http://vim.wikia.com/wiki/Search_and_replace_in_multiple_buffers

0 голосов
/ 25 декабря 2011

самым простым будет:

vim $(egrep -l '/foo/' **/*) -c 'bufdo %s/foo/bar/g'

но это не удастся, если в именах файлов есть пробелы, более надежный подход:

files=()
while IFS= read -rd '' filename; do
    files+=("$filename")
done < <(egrep -Zl '/foo/' **/*)
vim "${files[@]}" -c 'bufdo %s/foo/bar/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...