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

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

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

  • вырезать столбец int array в CSV без обрезки другого массива varchar
  • Замените данные в столбце в файле данными в строке из другого файла
  • sh-скрипт, содержащий элемент perl, не производит такой же вывод через crontab как ручное выполнение
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • Пройти через код состояния выхода после использования ||
  • Печатать аргументы оболочки в обратном порядке
  • echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile 

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

    ОБНОВИТЬ:

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

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

  • Строка состояния соответствует reg.expression
  • Каков наилучший инструмент для автоматизации 32-64-битных библиотек для Unix и Windows, создающих программное обеспечение на C ++, воспроизводимое пользователями и машинами?
  • Grep огромное количество шаблонов из огромного файла
  • файл резервной копии локально в сценарии оболочки
  • sed или awk: удалить строку, которая начинается с числа и заканчивается на rpm
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • 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" 

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

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