Скажем, у меня есть куча файлов XML, которые не содержат новой строки, но в основном содержат длинный список записей, ограниченный </record><record>
труба одна длинная линия, как несколько строк
Если разделителем были </record>\n<record>
я мог бы сделать что-то вроде cat *.xml | grep xyz | wc -l
для подсчета экземпляров интересующих записей, потому что кошка будет выводить записи по одному в каждой строке.
Есть ли способ написать SOMETHING *.xml | grep xyz | wc -l
, где SOMETHING
может транслировать записи по одной в строке? Я попытался использовать awk
для этого, но не смог найти способ избежать потоковой передачи всего файла в память.
Будем надеяться, что вопрос достаточно ясно :)
Это работает очень хорошо, намного быстрее, чем моя версия 'awk', но чтобы быть понятным, это заставляет' sed' читать весь файл в памяти, правильно? Есть ли более «потоковая» версия? Что делать, если XML-файл представляет собой гигантский размер? – nicolaskruchten
@nicolas: Вы можете использовать Perl и функцию 'read' (а не' '> оператор), чтобы читать фрагменты файла, вставлять новые строки и записывать их. Единственным сложным битом является то, что если Block 13 окажется неудачным, чтобы закончить часть пути через последовательность '', вы сохраняете конечный контекст для обработки со следующей частью. Обратите внимание, в частности, что если блок 13 заканчивается символом '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Я не думаю, что есть стандартная утилита для такого рода расщепления; большинство утилит Unix работают на линиях. –
немного читаем: 'sed $ 's | | & \ n | g '... '- использует конструкцию bash [' $' ''] (http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting) для включения escape-последовательностей в строках. –