The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Модификация файла, !*! ajvon, 27-Сен-05, 17:27  [смотреть все]
Хочу perl"ом изменять файл. Некоторые строчки удалять, некоторые изменять. Как это сделать? Получилось только записать в конец файла. Вижу решение только в создании временного файла, а потом сделать cp tempfile origfile.
  • Модификация файла, !*! 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..

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




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

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