Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: подскажите по shell  (Прочитано 1810 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн flaviy

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
подскажите по shell
« : 05 Августа 2009, 00:27:58 »
Подскажите кто сможет плиз. Есть файл 19 метров. в нём куча тегов <urlset.........> и </urlset> Нужно удалить все промежуточные кроме открывющего <urlset.........> и закрывающего </urlset>. Если кто знает - плиз хелп.........

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: подскажите по shell
« Ответ #1 : 05 Августа 2009, 00:31:19 »
а почему именно shell, вы другой язык программирования знаете?
этож просто работа с текстом...

Оффлайн flaviy

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: подскажите по shell
« Ответ #2 : 05 Августа 2009, 00:37:02 »
Пытался на  php. Но памяти жрёт много в любом случае. А  это действие нужно выполнять  периодически.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: подскажите по shell
« Ответ #3 : 05 Августа 2009, 00:46:59 »
а это просто текст или xml документ?
просто файл действительно большой и хоть на php хоть на shell, все равно будет долго

Оффлайн flaviy

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: подскажите по shell
« Ответ #4 : 05 Августа 2009, 00:49:28 »
это xml  - документ.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: подскажите по shell
« Ответ #5 : 05 Августа 2009, 00:51:28 »
ну вот и отлично, вы наверное в курсе что такое парсинг )))
в php есть замечательные функции для парсинга xml документов

Оффлайн flaviy

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: подскажите по shell
« Ответ #6 : 05 Августа 2009, 00:58:27 »
Прежде чем парсить его надо прочитать. Целиком не получается  из превышения допустимого количества употребляемой памяти.  А считывать кусками  то же особой  радости не доставит. Читал про ф-ию  sed. Но как заменить все вхождения кроме первого и последнего не сображу

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: подскажите по shell
« Ответ #7 : 05 Августа 2009, 01:00:38 »
SimpleXML и на php.ru c этим словом
ну или читайте маны, я думаю, что это должно помочь

Оффлайн jel

  • Активист
  • *
  • Сообщений: 828
    • Просмотр профиля
Re: подскажите по shell
« Ответ #8 : 05 Августа 2009, 01:20:29 »
Как вариант прогнать через sed и заменить все вхождения. Потом с помощью head и tail найти первое и последнее и добавить их к результирующему файлу.

Оффлайн SureGOOD

  • Активист
  • *
  • Сообщений: 724
  • suregood.ru
    • Просмотр профиля
    • suregood.ru
Re: подскажите по shell
« Ответ #9 : 05 Августа 2009, 06:02:28 »
flaviy
т.к. файл большой. то читать нужно построчно, с помощью fgets
и пробегитесь немного по структуре файла, возможно надо будет учитывать перенос, если теги разбиваются при переносе, а вообще задача довольно простая, средствами php легко решается, поверьте, работал и с большими объемами данных(хоть вы и не сказали размер файла, но я уверен :) )

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: подскажите по shell
« Ответ #10 : 05 Августа 2009, 08:52:33 »
SimpleXML  в помощь.
Если на bash, то сделайте так.
1. Выделите строчки, которые надо удалять, как отдельные строчки.
sed 's/шило/\n&/g' - перед шило ентер
sed 's/мыло/&\n/g' - ентер после мыло.
2. Тем же sed удалите строчки с шило...мыло
Можно удалить и пустые строки, но это не обязательно.

Оффлайн flaviy

  • Автор темы
  • Любитель
  • *
  • Сообщений: 56
    • Просмотр профиля
Re: подскажите по shell
« Ответ #11 : 05 Августа 2009, 12:07:01 »
Спасибо всем. Буду пробовать

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: подскажите по shell
« Ответ #12 : 05 Августа 2009, 19:42:26 »
Можно awk использовать - он как раз для такого предназначен.
Читает файл построчно, точнее, последовательно по одной записи, и для каждой записи выполняет указанные действия.
Можно отлавливать в строке открывающие и закрывающие тэги, увеличивать или уменьшать значение переменной в зависимости от того, какой попался, и, если переменная больше 0, вырезать эти тэги из записи.

Что-то типа такого:
[untested]

BEGIN {st=0}
/<urlset/ { if(st>0) {
                    print gensub(/<urlset .*>/,"","g",$0);
                    st=st+1;
                  }
             }
/<\urlset/{ if(st>0) {
                    print gensub(/<\urlset>/,"","g",$0);
                    st=st-1;
                  }
                }

[/untested]
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: подскажите по shell
« Ответ #13 : 05 Августа 2009, 20:24:44 »
Прежде чем парсить его надо прочитать. Целиком не получается  из превышения допустимого количества употребляемой памяти.  А считывать кусками  то же особой  радости не доставит. Читал про ф-ию  sed. Но как заменить все вхождения кроме первого и последнего не сображу
SAX-парсерам не надо читать весь файл, правда пользоваться ими значительно сложнее.
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: подскажите по shell
« Ответ #14 : 06 Августа 2009, 08:42:24 »
Для справки.
xml файл имеет одну строку, в обычном понимании.
Перед тем как на него натравить построчные утилиты обработки типа sed, awk (или что-то еще), его надо разбить на строчки.

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.