- Модификация файла, ajvon, 12:36 , 30-Сен-05 (1)
Я делал так open f, "+< modifyfile_res" while (!eof (f)) { $var=<f>; if ($var=~m/druga/) { $var=~s/druga//; print f $var; } } close (f); И в результате все добавляэться в конец файла. А мне надо заменить строчку в которой есть слово druga Посоветуйте, пожалуйста, как это правильно сделать.
- Модификация файла, chip, 14:59 , 30-Сен-05 (2)
>Я делал так >open f, "+< modifyfile_res" >while (!eof (f)) >{ > $var=<f>; > if ($var=~m/druga/) > { > $var=~s/druga//; > print f $var; > } >} >close (f); >И в результате все добавляэться в конец файла. А мне надо заменить >строчку в которой есть слово druga >Посоветуйте, пожалуйста, как это правильно сделать. Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать sed . В качестве идеи для perl'a: echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));' Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.
- Модификация файла, ajvon, 15:34 , 30-Сен-05 (3)
>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать >sed . Тоесть делать вставки system (sed 's/....//');? > >В качестве идеи для perl'a: >echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));' > >Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до >cp tempfile origfile Разве не так?
- Модификация файла, chip, 19:01 , 30-Сен-05 (4)
>>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать >>sed . >Тоесть делать вставки system (sed 's/....//');? Нет. Использовать командный интерпретатор и sed. А о perl'e забыть. >> >>В качестве идеи для perl'a: >>echo 'u!r.l9i!%!a!m%zt4e23s%-p5i62h11c' | perl -e '$_ = do { local $/; <STDIN> }; s/(%|!|\d*)//g; s/z/\@/g; print reverse(split(//));' >> >>Т.е. конструкцией: do { local $/; <FILEHANDLE> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти. > >Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до >>cp tempfile origfile >Разве не так? Что мешает записать $_ в тот же файл?! Предварительно сместив указатель на начало файла. >Это фактически вывод в другой файл(здесь STDOUT), и все сводиться до Разница имеется. Нет временного файла, все манипуляции осуществляются в памяти. Если хотите непосредственно манипулировать файлом на диске, а не во временном хранилище используйте seek. Пример, #!/usr/bin/env perl -w my $POSITION = 2; open(FH, "+< filename") || die "can't update somewhere: $!"; seek(FH, $POSITION, 0); # munge the record print FH \000; close FH; perldoc -f seek ps: и, наконец, perldoc -q file
- Модификация файла, MaximKuznetsov, 22:40 , 30-Сен-05 (5)
формулируйте задачу правильно.. Формулировка не должна зависить от средств реализации - Насколько можно представить, Вы хотите некоторые строки соотвествующие одному шаблону удалить, а некоторые, соответствующие другому шаблону изменить последовательно читать - и сравнивать с двумя шаблонами..awk, sed.. правильно заданный вопрос - половина ответа, а то и больше; если правильно задать вопрос, то и ответ как-то сам находится...
|