The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Модификация файла"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Модификация файла" 
Сообщение от ajvon emailИскать по авторуВ закладки(??) on 27-Сен-05, 17:27  (MSK)
Хочу perl"ом изменять файл. Некоторые строчки удалять, некоторые изменять. Как это сделать? Получилось только записать в конец файла. Вижу решение только в создании временного файла, а потом сделать cp tempfile origfile.
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Модификация файла" 
Сообщение от ajvon emailИскать по авторуВ закладки(??) on 30-Сен-05, 12:36  (MSK)
Я делал так
open f, "+< modifyfile_res"
while (!eof (f))
{
  $var=<f>;
  if ($var=~m/druga/)
  {
    $var=~s/druga//;
    print f $var;
  }
}
close (f);
И в результате все добавляэться в конец файла. А мне надо заменить строчку в которой есть слово druga
Посоветуйте, пожалуйста, как это правильно сделать.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Модификация файла" 
Сообщение от chip emailИскать по авторуВ закладки(ok) on 30-Сен-05, 14:59  (MSK)
>Я делал так
>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> } читаем в переменную весь файл, а потом можем изгаляться над ним сколько вздумается. Нужно помнить, что на больших файлах могут выйти накладки с распределением памяти.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Модификация файла" 
Сообщение от ajvon emailИскать по авторуВ закладки(??) on 30-Сен-05, 15:34  (MSK)
>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>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
Разве не так?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Модификация файла" 
Сообщение от chip emailИскать по авторуВ закладки(ok) on 30-Сен-05, 19:01  (MSK)
>>Если стоит не комплексная задача, а только изменение файла настоятельно рекоммендую использовать
>>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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Модификация файла" 
Сообщение от MaximKuznetsov Искать по авторуВ закладки on 30-Сен-05, 22:40  (MSK)
формулируйте задачу правильно..
Формулировка не должна зависить от средств реализации -
Насколько можно представить, Вы хотите некоторые строки соотвествующие одному шаблону удалить, а некоторые, соответствующие другому шаблону изменить

последовательно читать - и сравнивать с двумя шаблонами..awk, sed..

правильно заданный вопрос - половина ответа, а то и больше; если правильно задать вопрос, то и ответ как-то сам находится...

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру