Nano Hash - криптовалюты, майнинг, программирование

Как сделать вывод grep раздельным по символам NULL?

Предположим, мы выполняем многострочный поиск по шаблону регулярного выражения в группе файлов и хотим извлечь совпадения из grep. По умолчанию grep выводит совпадения, разделенные символами новой строки, но поскольку мы используем многострочные шаблоны, это создает неудобство, заключающееся в том, что мы не можем легко извлечь отдельные совпадения.

Пример

grep -rzPIho '}\n\n\w\w\b' | od -a

В зависимости от файлов в вашем файловом дереве это может привести к выводу, например

0000000   }  nl  nl   m   y  nl   }  nl  nl   i   f  nl   }  nl  nl   m
0000020   y  nl   }  nl  nl   m   y  nl   }  nl  nl   i   f  nl   }  nl
0000040  nl   m   y  nl
0000044

Как видите, мы не можем разбить символы новой строки, чтобы получить совпадения для дальнейшей обработки, поскольку совпадения сами содержат символы новой строки.

Что не работает

Теперь --null (или -Z) работает только в сочетании с -l, что заставляет grep отображать только имена файлов вместо совпадений, так что здесь это не помогает.

Обратите внимание, что это не дубликат Есть ли эквивалент grep для ключей find -print0 и xargs -0?, потому что требования в этом вопросе разные, что позволяет ответить на него, используя альтернативные методы.

Итак, как мы можем заставить это работать? Может быть, использовать grep в сочетании с другими инструментами?


  • Я собираюсь согласиться с тем, что вы не можете здесь, если grep сам по себе не может сделать это за вас (и кто сказал, что у вас нет NUL в ваших сопоставленных данных для начала). Вы уже злоупотребили grep, чтобы заставить это работать. Я бы либо использовал вывод od (или аналогичный), либо использовал инструмент, отличный от grep, с помощью которого вы можете лучше контролировать вывод (awk или perl или что-то еще). 17.03.2016
  • Кортеж из имени файла, смещения в байтах и ​​длины совпадения позволит вам собирать фактические совпадения, когда они вам понадобятся. Я не думаю, что это выполнимо с grep, но реализовать это на Python или Perl не должно быть сложно. 17.03.2016
  • Можете ли вы добавить образец текста к своему вопросу и ожидаемый результат? Я бы также рекомендовал использовать для этого awk. 17.03.2016
  • @EtanReisner Да, наши файлы могут содержать нулевые символы, но для исходного кода ascii (я обычно использую исходный код grep) нулевые символы не совсем распространены, в то время как символы новой строки встречаются :) Кроме того, я не чувствую, что злоупотреблял grep для этого. Grep — это механизм сопоставления шаблонов, и я просто хочу сопоставлять шаблоны и извлекать их. 18.03.2016
  • Теперь проблема окончательно решена: stackoverflow.com/a/36090268/1546844 18.03.2016

Ответы:


1

Поэтому я отправил эту проблему как запрос функции в список рассылки ошибок GNU grep, и оказалось, что это ошибка в коде.

Он был исправлен и передан в мастер, поэтому он будет доступен в следующем выпуске GNU grep: http://git.savannah.gnu.org/cgit/grep.git/commit/?id=cce2fd5520bba35cf9b264de2f1b6131304f19d2

Подводя итог: этот патч гарантирует, что флаг -z работает не только в сочетании с -l, но и с -o.

18.03.2016

2

Мне приходит в голову использовать разделитель групп, например, что-то вроде:

grep -rzPIho '}\n\n\w\w\b' $FILE -H | sed "s/^$FILE:/\x0/"
18.03.2016
  • Да, это выглядит довольно просто. Не совсем доказательство, если у вас очень короткие файлы, но +1. Нужна дополнительная логика при создании большего количества файлов, кстати 18.03.2016
  • Да, это не совсем надежно и нуждается в улучшении; это также зависит от содержимого файла. Пожалуйста, дайте нам знать, если вы найдете лучшее решение :^) 18.03.2016
  • Проверьте мой последний ответ 18.03.2016

  • 3

    Вот еще один способ сделать это, который должен быть более надежным, чем тот, который опубликовал @bufh, но который также является более сложным и медленным.

    $ grep -rIZl '' --include='*.pl'| xargs -0 cat | dos2unix | tr '\n\0' '\0\n' \
          | grep -Pao '}\x00\x00\w\w\b' | tr '\0\n' '\n\0' | od -a
    

    Очевидно, что dos2unix нужен только при работе с окончаниями строк Windows. Итак, изюминка здесь в том, что мы меняем местами нулевые байты с новыми строками во входных данных, вместо этого сопоставляем grep с нулевыми байтами и меняем местами обратно.

    0000000   }  nl  nl   m   y  nul   }  nl  nl   i   f  nul   }  nl  nl   m
    0000020   y  nul   }  nl  nl   m   y  nul   }  nl  nl   i   f  nul   }  nl
    0000040  nl   m   y  nul
    0000044
    
    18.03.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..