Friday, December 22, 2006
Редактирование множетва файлов (diff, patch)
В случае, если необходимо сделать мелкие исправления сразу в множестве не идеинтичных файлов, могут очень помочь утилиты diff/patch.
Например, сегодня нужно было исправить e-mail адреса в конфигах десяти разных инсталляциях одной программы. Можно было ручками пройтись и тупо редактировать файлы, но это не интересно. Вот, как это можно сделать:
Далее, необходимо убедиться в том, что все ок и удалить *.orig файлы (резервные копии, оставленные программой patch. Сделать это можно командой find -name file.orig -rm).
При составлении патча нужно быть внимательным, т.к. легко перепутать исходный и резервный файлы и получить "перевернутый" патч, который будет пытаться делать в исходном файле изменения, которые необходимо сделать в отредактированном для получения исходного. Впрочем, программа patch корректно обрабатывает эту ситуацию и не даст испортить файл. Но все равно, лучше сразу сделать все нормально.
Например, сегодня нужно было исправить e-mail адреса в конфигах десяти разных инсталляциях одной программы. Можно было ручками пройтись и тупо редактировать файлы, но это не интересно. Вот, как это можно сделать:
mkdir _wrk && cd _wrk - создать временный каталог
cp ~/installation1/file . - скопировать в него один из файлов.
cp file file.bak - сохранить старую версию
vim file - внести необходимые изменения
diff file.bak file > ~/patch - создать патч.
cd ~ - перейти в каталог, в котором наохдятся все инсталляции
find -name file -print0 | xargs -n1 -J % echo "patch " % " ~/patch" > script найти все файлы, которые нужно отредактировать и сохранить скрипт, который сделает все необходимые изменения
cat script - убедиться, что не нашлось ничего лишнего (например, тот же файл, но в бекапах)
sh script - поехали!
Далее, необходимо убедиться в том, что все ок и удалить *.orig файлы (резервные копии, оставленные программой patch. Сделать это можно командой find -name file.orig -rm).
При составлении патча нужно быть внимательным, т.к. легко перепутать исходный и резервный файлы и получить "перевернутый" патч, который будет пытаться делать в исходном файле изменения, которые необходимо сделать в отредактированном для получения исходного. Впрочем, программа patch корректно обрабатывает эту ситуацию и не даст испортить файл. Но все равно, лучше сразу сделать все нормально.
Comments:
<< Home
Если умный sed, то решать задачу лучше с помощью find ... | xargs -0 sed -i .orig 's///g', если sed глупый, то заменить его на perl -p -i .orig -e 's///g'
patch тут как-то очень сбоку :)
patch тут как-то очень сбоку :)
patch эту задачу решает как-то по-нагляднее.. И потом, в моем случае изменения были объемными, замучаешься писать регекспы..
Хотя.. наверное, именно для конфиг-файлов подойдет что-нибудь вроде perl -pi.orig -e 's/^(Option1).+?$/$1\tNewValue\n/g; s///g; s///g;', но, честно говоря, не очень красиво..
Post a Comment
Хотя.. наверное, именно для конфиг-файлов подойдет что-нибудь вроде perl -pi.orig -e 's/^(Option1).+?$/$1\tNewValue\n/g; s///g; s///g;', но, честно говоря, не очень красиво..
<< Home