2016-12-23 7 views
0

Как извлечь заголовки из c-файла, который содержит их вот так?Регулярное выражение для извлечения имени заголовка из c-файла

#include <tema4header9.h> 
#include <tema4header3.h> 
#include <stdio.h> 
#include  <longnametest/newheader.h> 
#include <net/header.h> 
#include "last-test-Zhy3/DrRuheader.h" 
#include <last-test-8fF7/a5xyheader.h> 

Я пытался использовать:

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

, но он работает только для тех, кто в подкаталогах. Кроме того, если я типа:

sed -n -e 's/#include[ \t]*[<"]\(([^ \/<"]*\/)+[^ \/]*\)\.h[">]/\1\.h/p'

или

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

команда больше не работает. Выходной файл должен выглядеть следующим образом:

tema4header9.h 
tema4header3. 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 
+0

Что вы ожидаемый результат? 'tema4header9.h' и т. д.? – Inian

ответ

2

grep Решение: Это регулярное выражение с помощью PERL и печати ничего между "<" или '"' на линиях, которые начинаются с #include.

grep -oP '^#include.*(<|")\K.*(?=>|")' headers 
tema4header9.h 
tema4header3.h 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 

Если вы нормально с awk:

awk '/#include/{gsub(/<|>|"/,"",$2);print $2}' headers 
tema4header9.h 
tema4header3.h 
stdio.h 
longnametest/newheader.h 
net/header.h 
last-test-Zhy3/DrRuheader.h 
last-test-8fF7/a5xyheader.h 
+0

Просто '' (? <= "| \) '' является достаточным для 'grep' – Inian

+0

@ Инициативу, чем он может извлечь некоторые данные из нежелательной строки в' file.c', как 'cout <<" эй там "<< "x> y" << endl; 'поэтому добавил' # include' как меру безопасности. его до OP, чтобы оценить риск. –

+0

Я имел в виду для части извлечения в кавычки и '<' самостоятельно, согласитесь, что предыдущая часть необходима. – Inian

0

Это должно работать:

sed -nr 's/#include\s+[<"]([^>"]+)[>"].*/\1/p' 
Смежные вопросы