Великолепные инструменты для поиска и замены в файлах? - PullRequest
10 голосов
/ 02 марта 2010

Я перехожу с Windows-специфичного редактора на VIM на философию «используй один редактор для всего и изучай его очень хорошо».

Однако в PHP-редакторе мне понравилась одна функция - найти и заменить. Я мог бы подойти к делу двумя способами:

  • Просто найди . Найдите строку во всех файлах проекта, просмотрите все перечисленные вхождения и нажмите, чтобы погрузиться в этот файл в этой строке.
  • Слепо замените все вхождения "foo" на "bar".

И, конечно, я мог бы использовать графический интерфейс, чтобы сказать, какие типы файлов, нужно ли искать в подпапках, чувствительны ли они к регистру и т. Д.

Сейчас я пытаюсь приблизить эту способность, и попытка собрать ее вместе с bash довольно утомительна. Выполнимо, но утомительно.

Кто-нибудь знает какие-нибудь замечательные инструменты для таких вещей, как эта, для Linux и / или Windows? ( Я бы действительно предпочел GUI, если это возможно. ) Или, если это не удастся, скрипт bash, который хорошо справляется со своей задачей? (Если бы в нем были перечислены имена файлов и номера строк и показаны фрагменты кода, это было бы здорово.)

Ответы [ 14 ]

8 голосов
/ 02 марта 2010

Попробуйте сед. Например:

sed -i -e 's/foo/bar/g' myfile.txt
7 голосов
/ 03 марта 2010

В Vim встроен многофайловый поиск с помощью команды :vimgrep (или :grep для использования внешней программы grep - это единственная опция до Vim 7).

:vimgrep будет искать в файлах регулярное выражение и загружать список совпадений в буфер - затем вы можете перемещаться по списку результатов визуально в буфере или с помощью команд :cnext и :cprev. Он также поддерживает поиск по деревьям каталогов с помощью подстановочного знака **. например

:vimgrep "^Foo.*Bar" **/*.txt

для поиска строк, начинающихся с Foo и содержащих Bar в любом файле .txt в текущем каталоге.

:vimgrep использует буфер 'quickfix' для хранения своих результатов. Существует также :lvimgrep, который использует локальный буфер, специфичный для используемого вами окна.

Vim не поддерживает замену нескольких файлов из коробки, но есть плагины, которые будут делать это тоже на vim.org .

5 голосов
/ 02 марта 2010

Я не понимаю, почему вы не можете сделать это с VIM.

Просто найди

/Foo

Подсвечивает все экземпляры Foo в файле, и вы можете делать, что хотите.

Слепая замена

:% s/Foo/Bar/g

Очевидно, что это только вершина айсберга. У вас есть большая гибкость в области поиска и полная поддержка регулярных выражений для вашего термина. Он может не работать точно так же, как ваш прежний редактор, но я думаю, что ваша оригинальная идея «использовать один редактор» является верной.

4 голосов
/ 02 марта 2010

Блокнот ++ позволяет выполнять поиск и замену во всей папке (и подпапках) с поддержкой регулярных выражений.

2 голосов
/ 03 марта 2010

Поскольку вы ищете инструмент с графическим интерфейсом, я обычно использую следующие 2 инструмента. Оба они имеют отличную функциональность, включая сопоставление с использованием wildcat, регулярные выражения, фильтр типов файлов и т. Д. Оба они отображают полезную информацию о попадании в файлы, например имя файла / строки.

  1. Visual Studio: быстро, но мощно. Я использую его, если номер файла огромен (скажем, десятки тысяч ...)

  2. pspad : легкий. Хорошей особенностью поиска / замены для pspad является то, что он организует обращения в разные файлы в древовидной иерархии, что очень ясно.

2 голосов
/ 02 марта 2010

Вы можете использовать perl в командной строке для замены текста в файлах.

perl -p -i".backup" -e "s/foo/bar/g" test.txt
1 голос
/ 03 марта 2010

Для Windows я думаю, что grepWin трудно победить - графический интерфейс для мощного и гибкого инструмента grep для Windows. Он ищет и заменяет, знает о регулярных выражениях и тому подобное.

1 голос
/ 03 марта 2010

Я не знаю, подходит ли вам этот вариант, но загружаете ли вы все свои файлы в vim с помощью vim *.php чем вы можете

:set hidden

:argdo %s/foo/bar/g => выполнит команду подстановки во всех открытых буферах

:wall => запишет все открытые буферы

Или вместо загрузки всех ваших файлов в vim попробуйте :help vimgrep и комбинацию :help argdo и :help argadd

1 голос
/ 02 марта 2010

Есть ряд инструментов, которые вы можете использовать, чтобы упростить задачу.Во-первых, для поиска всех файлов в проекте из vim вы можете использовать :grep, например, так:

:grep 'Function1' myproject/

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

Ctags - это инструмент, который находит объявления в вашем коде, а затем позволяет vim переходить к этим объявлениям.Для этого запустите ctags, а затем наведите курсор на вызов функции и затем используйте Ctrl-].Вот ссылка с дополнительной информацией о ctags:

http://www.davedevelopment.co.uk/2006/03/13/vim-ctags-and-php-5/

0 голосов
/ 02 марта 2010

A очень полезный инструмент поиска - ack. (Ubuntu в репозиториях и на страницах руководства называет его «ack-grep».)

Краткая версия того, что он делает, представляет собой комбинацию find и grep, более мощную и интеллектуальную, чем эта пара.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...