У нас есть задача изменить некоторые строки в двоичных файлах на строчные (от смешанного / верхнего / любого другого). Соответствующие строки являются ссылками на другие файлы (это связано с обновлением, когда мы также переходим с Windows на Linux в качестве серверной среды, поэтому случай вдруг имеет значение). Мы написали скрипт, который использует цикл perl для этого. У нас есть каталог, содержащий около 300 файлов (общий размер каталога составляет около 150 МБ), поэтому это некоторые данные, но не огромные.
Следующий perl-код занимает около 6 минут, чтобы выполнить работу:
for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'`
do
(( updated++ ))
write_line "Converting case of string: $file_ref "
perl -i -pe "s{(?i)$file_ref}{$file_ref}g" $forms6_convert_dir/*
done
, в то время как следующий код perl занимает более 3 часов!
for file_ref in `ls -1F $forms6_convert_dir/ | grep -v "/" | sed 's/\(.*\)\..*/\1/'`
do
(( updated++ ))
write_line "Converting case of string: $file_ref "
perl -i -pe 's{(?i)$file_ref}{$file_ref}g' $forms6_convert_dir/*
done
Кто-нибудь может объяснить, почему? Это то, что $ file_ref остается в виде строки $ file_ref вместо того, чтобы заменяться значением в версии одинарных кавычек? в каком случае, что это заменяет в этой версии? Мы хотим заменить все вхождения любого имени файла на себя, но в нижнем регистре. Если мы запускаем строки в файлах до и после и ищем имена файлов, то оба, похоже, внесли одинаковые изменения. Однако, если мы запустим diff для файлов, созданных двумя циклами (diff firstloop / file1 secondloop / file1), он сообщит, что они различаются.
Это выполняется из скрипта bash в linux.