ack клон

На днях мне в очередной раз понадобилось заменить в куче файлов одну строчку на другую. Нужно было сделать 30 замен. Обычно надо меньше замен и я делаю это руками, но на этот раз я подумал, что буду выглядеть как идиот, делая 30 замен. Я понял — мне нужен инструмент для массовой замены строк в файлах. Я решил посмотреть в гугле. Ничего хорошего с ходу найти не удалось. Я решил поискать в гентушных портах. Там тоже ничего не нашлось. Вернее, нашлось но оно уходило в бесконечную рекурсию и жрало всю мою память. Или хотело 30 метров зависимостей, чтобы вывести мне диалоговое окошко с опциями. Я понял — время велосипеда пришло! Чтобы велосипед был 100% велосипедным я решил заодно воплотить в нём фунциональность утилиты ack.

Ack — в свою очередь является велосипедом, реализующим функции утилиты grep. Но в отличие от grep ack по умолчанию:

  • ищет рекурсивно
  • игнорирует .svn, .hg и другие директории
  • игнорирует swap файлы vim и прочие мусорные файлы
  • раскрашивает вывод

Казалось бы мелочи, но до чего приятные! В общем, я решил, что мой велосипед помимо массовой замены должен уметь просто искать строки в стиле a la ack. Приятные мелочи вдвойне приятней, когда они сделаны собственными руками =)

После тяжёлых мозговых потуг я придумал имя своей двухколёсной утилите: sr. Почему sr? Потому что: а) две буквы набирать легко и приятно, б) это акроним от search replace.

На данный момент утилита умеет:

  • рекурсивный поиск по умолчанию
  • искать подстроку и делать раскрашенный вывод результатов (слизано с ack)
  • искать строку и заменять её на другую. Проверено, работает.
  • искать только/фильтровать по типу файлов (используя стандартный расширения). Например, sr —python fook будет искать строку fook в текущей директории рекурсивно только в python файлах. А sr —noperl fook будет искать строку fook в текущей директории рекурсивно во всех файлах кроме перловых.
  • если строка в файле очень длинная, то выводится сообщение, что строка очень длинная. При использовании ack у меня бывали случаи, когда ack пытался вывести строку из mysql дампа и на экран выбрасывалось всё содержимое это длииинной строки. В своём велосипеде хотелось бы исправить эту досадную багафичу.
  • для всех заменяемых файлов автоматически генерируется backup файл

Код программы доступен здесь: http://hg.pydev.ru/sr/

Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

Comments

find + sed

Мороки с ними много всегда.

find PATH | xargs sed -e ‘s/WHAT/TO_WHAT/g’

http://pypi.python.org/pypi/grin

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image