Можно ли использовать 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 

  • Сценарий оболочки для фильтрации даты отдельно от конкретного столбца файла .csv и сохранения вывода в другом файле csv
  • Двойная квадратная скобка внутри шаблона grep
  • Ошибка grep: операнд оператора повторения недействителен
  • Греп из строки в строку
  • Многострочный grepping - Что не так с этим выражением?
  • Как grep строка в нескольких файлах по месяцам
  • Отметить появление ключевого слова с другим цветом
  • Эхо-список процесса не работает
  • 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 

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

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