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/






Comments
find + sed
Мороки с ними много всегда.
find PATH | xargs sed -e ‘s/WHAT/TO_WHAT/g’
http://pypi.python.org/pypi/grin