Можно ли использовать grep lookaroud несколько раз?

<table name="content_analyzer" another-key="id9"> <type="global" /> </table> <table name="content_analyzer2" another-key="id12"> <type="global" /> </table> <table name="content_analyzer" primary-key="id9"> <type="global" /> </table> <table name="content_analyzer2" primary-key="id12"> <type="global" /> </table> <table name="content_analyzer_items" primary-key="id56"> <type="global" /> </table> 

если я хочу извлечь значение имени, тогда:

 grep -Po 'name="\K.*?(?=")' 

но как это сделать для значения имени и первичного ключа одновременно? Например, нижняя строка не работает.

 grep -Po 'name="\K.*?(?=") primary-key="\K.*?(?=")' 

так что это выглядит

 content_analyzer id9 content_analyzer2 id12 content_analyzer_items id56 

  • Греп остальной линии ... после матча
  • Как я могу найти шаблон одного файла в другом и сохранить результат каждого шаблона в новом файле
  • Какова цель этих специальных символов в команде sed?
  • Фильтрация по датам с помощью grep и awk
  • Номер Грепинга в файле
  • Получение строк из файлов с определенным расширением
  • Что эквивалентно «grep | разрезать "с помощью sed или awk?
  • Поиск второй строки файлов и имена файлов для печати в stdout
  • 3 Solutions collect form web for “Можно ли использовать grep lookaroud несколько раз?”

    Использование sed :

     $ sed -nr 's/^[^\s]+\sname="([^"]+)"\s.*primary-key="([^"]+)">$/\1 \2/p' file.txt content_analyzer id9 content_analyzer2 id12 content_analyzer_items id56 

    Используя grep с помощью PCRE, вы можете получить:

     $ grep -Po '(name|primary-key)="\K[^"]+' file.txt content_analyzer id9 content_analyzer2 id12 content_analyzer_items id56 

    Вы можете сделать это с помощью awk :

     $ awk '{for(i=1; i<=NF; i++){if($i~/^name=/ || $i~/^primary-key=/){print $i}}}' 

    Результат:

     name="content_analyzer" name="content_analyzer2" name="content_analyzer" primary-key="id9"> name="content_analyzer2" primary-key="id12"> name="content_analyzer_items" primary-key="id56"> 

    awk будет искать name= или primary-key= и распечатать значение этого поля.

    Вы не можете использовать lookaround regexp для выбора нескольких частей линии, как предполагалось.

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

     $ perl -ne 'print if s/.*name="(.*?)".*primary-key="(.*?)".*/\1 \2/' file content_analyzer id9 content_analyzer2 id12 content_analyzer_items id56 

    Это не использует никакой конструкцию поиска и самоочевидно.

    Interesting Posts

    Есть ли способ для сценария оболочки узнать, какая программа его выполнила?

    Как запустить определенную архитектуру (32/64) Python в Centos6, когда оба установлены?

    / bin / sh: определение функции импорта ошибок для `some-function '

    Как я могу открыть thunar, чтобы он выбирал конкретный файл?

    Как контролировать напряжение процессора для Dell XPS15 9550 (Skylake i5-6300HQ) под Linux

    Как проверить, какие бинарные файлы зависят от определенных файлов в / lib?

    CentOS не видит USB-устройство

    Почему установка Linux не работает на этом компьютере?

    Подкатегории MV на один уровень, но не root

    гибридная графика не работает на ноутбуке asus, работающем debian

    Как изменить местоположение, где скриншоты сохранены в Linux Mint 17 Cinnamon?

    Opensuse 11.4 очень медленный на 8 ГБ ОЗУ i5 процессор

    Обнаружение причины tcp rcvpruned?

    Как перенаправить HTTP-запросы на локальный сервер Apache при подключении к Интернету?

    Слэш и обратная косая черта в sed

    Linux и Unix - лучшая ОС в мире.