Не уклоняйтесь от Perl: это облегчает задачу такого рода!
#! /usr/bin/perl -i.bak
use warnings;
use strict;
my $old = join "|" => qw(
Field_Blob_Medium
Field_Boolean
Field_Unsigned_Int
);
chomp(@ARGV = `find . -iname \*.[ch]pp -print0 |
xargs -0 grep -lE '($old)'`);
unless (@ARGV) {
warn "$0: nothing to do!\n";
exit 0;
}
while (<>) {
s[Field_Blob_Medium] [my::ns::MediumBlob]g ||
s[Field_Boolean] [my::ns::Bool]g ||
s[Field_Unsigned_Int] [my::ns::UInt]g;
print;
}
Переключатель -i
предназначен для редактирования на месте. Он автоматически создает резервные копии и записывает преобразованные результаты в исходные местоположения.
Установка @ARGV
делает так, как будто вы вызывали программу только с теми файлами *.cpp
и *.hpp
, которые содержат старые имена классов. Переключатель -E
на grep
включает расширенные регулярные выражения, поэтому неэкранированные (
, )
и |
являются метасимволами.
Если хитов не было (, т.е. , если @ARGV
пусто), то тут делать нечего.
В противном случае, для каждой строки каждого файла со старыми именами (механизм, который обрабатывает Perl для вас!), Попробуйте переименовать Field_Blob_Medium
в my::ns::MediumBlob
и так далее. Обратите внимание, что эти попытки замены прекращаются после первого успеха, поэтому, если строка содержит два разных старых имени, одно будет заменено, а другое останется прежним.
Обычно оператор подстановки пишется s///
, но вы можете использовать разделители в квадратных скобках, как указано выше. Я сделал это, чтобы выровнять по левому краю новые имена.
Конечно, это замена вашей фактической замены.
Наконец, print
возможно измененная строка, которая из-за -i
записывает ее в обновленный исходный файл.