Вопрос или проблема
У меня есть текстовый файл объемом несколько гигабайт, и я хочу заменить все вхождения utf8mb4_0900_ai_ci
на utf8mb4_unicode_520_ci
.
Обычно я использовал бы sed -i
для этого, как предложено здесь: найти и заменить строку в файле без использования временного файла с помощью SED
Однако это создает временный файл за кулисами, а мне нужно, чтобы замена происходила в среде, где не будет достаточно дискового пространства для этого.
Как я могу изменить файл на месте?
Ответ или решение
Для выполнения замены строки в файле без использования временных файлов, особенно в условиях ограниченного дискового пространства, можно воспользоваться командой perl
с флагом -i
для редактирования файла на месте. Данная команда позволяет производить замену, сохраняя изменения без создания дополнительных временных файлов. Пример команды выглядит следующим образом:
perl -pi -e 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_520_ci/g' ваш_файл.txt
Давайте разберём параметры команды:
perl
: это интерпретатор языка Perl, который поддерживает регулярные выражения и позволяет выполнять замены.-p
: эта опция заставляет Perl обрабатывать файл построчно, автоматически выводя каждую строку после обработки.-i
: эта опция отвечает за редактирование файла на месте. Если вы хотите сделать резервную копию оригинала, вы можете указать расширение, например-i.bak
, что создаст файл резервной копии с указанным расширением.-e
: позволяет вам передать Perl выражение для выполнения непосредственно из командной строки.s/old/new/g
: это выражение заменяет все (g
— глобальный флаг) вхождения строкиold
(в данном случаеutf8mb4_0900_ai_ci
) на строкуnew
(в данном случаеutf8mb4_unicode_520_ci
).
Важно понимать, что использование perl
в данном случае действительно не требует создания временных файлов, что делает его идеальным для работы с большими файлами в условиях ограничения по пространству на диске.
Протестируйте команду на небольшом файле перед запуском на большом, чтобы убедиться в правильности выполнения и ожидаемом результате.