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

  • извлечение строк из большого текстового файла
  • Команда Mac Terminal - поиск строки и печать с помощью окружения
  • Разбор допустимого вывода в скрипте оболочки с помощью sed / grep
  • сравнение 2 списков с дополнительными данными для печати
  • Распечатайте все подходящие строки и предыдущую незакрепленную строку
  • Фильтрация вывода журнала на отдельных линиях
  • grep список имен и информации из большего файла
  • ls | Работа grep не работает с ls --color
  • 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

    Драйвер графической подсистемы Intel для Linux Mint 17

    Как я могу настроить привязку пользовательских ключей даже в SSH-ed на другой компьютер?

    Установка Linux на UEFI ASUS Machine

    переопределение параметров для конфигурации клиента openssh

    Есть ли способ узнать, сколько экземпляров пользователя root регистрируется на Linux-машине?

    Заменить первый столбец файла с помощью вывода команды

    Почему Chromebook больше не разрешает подключения VPN в гостевом режиме?

    Как длина и ширина терминала передаются через SSH и telnet?

    Нет настроек CentOS Windows 8 GRUB при перезагрузке

    Замена строк в большом файле

    тире совместимость с bash

    Ограничьте / proc / mounts, чтобы избежать воздействия / run / user /

    Может перемещаться, но не может удалить пустой / домашний каталог (root, no attr, RW файловая система, а не точка подключения, а не занята)

    файл шаблона в качестве входа в RS, FS в awk / sed / grep для распознавания и добавления столбцов

    Как эмулировать функцию «Заменяет:» пакета Debian в RPM?

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