2012-04-11 3 views
1

Я пытаюсь заменить небольшое количество текста на определенной строке большого файла журнала (в общей сложности ~ 40 мил строк):замена фиксированного количества текста в большом файле

sed -i '20000000s/.\{5\}$/zzzzz/' log_file 

Цель это означает «отметить» строку с ожидаемой уникальной строкой для последующего тестирования.

Вышеупомянутая команда работает нормально, но редактирование на месте sedperl) создает временный файл, который является дорогостоящим.

Есть ли способ заменить фиксированное количество символов (т. Е. 5 символов с 5 другими символами) в файле без необходимости создания временного файла или очень большого буфера, который завершался бы тем же самым файлом temp ,

+0

просто разбить файл журнала (на день, неделю, месяц, год, десятилетие, век, тяжесть, задачи или любой другой) – KurzedMetal

ответ

3

Вы можете использовать dd заменить несколько байт на месте:

dd if=/dev/zero of=path/to/file bs=1 count=10 conv=notrunc skip=1000 

бы написать 10 нулей (0x00) после байта 1000s. Вы можете поместить все, что хотите заменить внутри файла, и написать путь к нему в параметре if. Затем вам нужно было вставить размер заменяемого файла в параметр count, поэтому весь файл будет прочитан.

параметр conv=notrunc указывает dd, чтобы оставить конец файла неиспользуемым.

Это должно хорошо работать для кодирования 1-байтового файла.

+0

спасибо, я не думал использовать 'dd' для этого. Но этот метод работает, устанавливая количество пропущенных байтов, а не строк. – Alex

+0

Вы можете рассчитать смещение байта с 'head' и' wc' (и некоторой арифметикой) –

0

ex является скриптах редактор файлов, поэтому он будет работать на месте:

ex log_file << 'END_OF_COMMANDS' 
20000000s/.\{5\}$/zzzzz/ 
w 
q 
END_OF_COMMANDS 
+1

Большинство редакторов не работают на месте: это означало бы, что вам ничего не нужно было спасать, потому что все, что вы пишете, было бы внутри файл, который вы редактируете. нет. – devsnd

Смежные вопросы