Awk для печати только соответствующего слова

Мне нужно создать скрипт, который будет создавать Makefile.

При проверке зависимостей я проверяю каждый .cpp-файл на свой заголовок «—. H». Я использую:

echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile 

Каков наилучший способ просто получить часть «myheader.h», исключая «», очевидно. Могу ли я добиться этого с помощью awk? Предпочтительнее, чем проще, тем лучше. Я едва, на данный момент, понимаю awk.

ОБНОВИТЬ:

Следующее решение моей проблемы:

 awk -F '"' '/\.h"/ {print $2}' $file 

  • Что такое «команда» на bash?
  • Как подсчитать вхождение строки, искать между шаблоном для определенной строки
  • Что означает синтаксис этих эхо-команд?
  • Есть ли команда unix, которая дает минимум / максимум двух чисел?
  • Возможно одновременное использование скобок (перестановки) и расширения массива?
  • Как извлечь положительные числа в первом столбце из вывода, как в вопросе?
  • Как удалить привилегии root в сценариях оболочки?
  • Соответствие парам «значение ключевого слова» из полуструктурированного ввода
  • 3 Solutions collect form web for “Awk для печати только соответствующего слова”

    Почему awk ? для этого? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile должен делать трюк.

    Опубликованный (и в настоящее время принятый) grep ответ имеет ряд проблем, не последним из которых является то, что будет напечатана любая строка, содержащая последовательность .h , а не только те, которые соответствуют регулярному выражению в сценарии Awk (например, , от ссылки на linkedlist.head структуры, такой как linkedlist.head ). Я бы использовал sed для этого:

     sed -n 's/^"\(.*h\)"$/\1/p "$file" >> Makefile 

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

     sed -n 's/^ *# *include *"\([^"]*\.h\)".*$/\1/p < "$file" >> Makefile 

    #include с опциональными пробелами, прежде чем это будет образованным предположением. Говядина здесь представляет собой регулярное выражение [^"]*\.h которое захватывает строку, которая не содержит двойных кавычек и заканчивается буквальными символами .h .

    С awk вы можете использовать:

     awk -F '"' ' /^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ { print $2 }' 

    Мы устанавливаем разделитель полей в " , соответствуют строкам, которые выглядят как

     #include "something.h" 

    И из них извлеките второе поле (так что между первым и вторым " ).

    Interesting Posts

    Как sudo прерывается в xterm на Ctrl-C?

    Поиск имени программы по шаблону

    Почему запуск firefox (из командной строки) в VM запускает firefox на главной машине и наоборот?

    сценарий оболочки для самоубийства

    Как узнать, какой цвет я дал xsetroot?

    Соедините каждую строку файла с определенной переменной во второй команде

    Linux Mint 17.3 и Ubuntu 15.10 Оба замораживания после загрузки в режиме реального времени USB

    Сервер Freeradius для нескольких сетей поставщиков

    каков эквивалент CentOS / var / log / syslog (на Ubuntu)?

    Анализ использования диска для корневого раздела, за исключением других разделов, смонтированных с помощью программы GUI?

    Нечувствительность к регистру, дублирующая строку, удалите дубликат по выбору случая с самым высоким дублированием

    Отобразить физический путь USB-устройства к номеру шины / устройства, возвращенному lsusb

    Установите ISO практически с помощью устройства / dev / sr0

    Может запустить пользовательский сервис systemd, не может его включить

    Как подключить LVM RAID к новой установке Ubuntu?

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