Por que awk
? por esta? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile
deve fazer o truque.
Eu preciso criar um script que produza um Makefile.
Ao verificar as dependências, verifico cada arquivo .cpp para o cabeçalho "---. h". Eu uso:
echo $(awk '/^".*h"$/ { print $0 }' $file) >> Makefile
Qual é a melhor maneira de obter a parte 'myheader.h', excluindo '', obviamente. Posso conseguir isso com o awk? De preferência, quanto mais simples melhor. Eu mal, neste momento, entendi o awk.
ATUALIZAÇÃO:
O seguinte resolveu meu problema:
awk -F '"' '/\.h"/ {print $2}' $file
A resposta grep
postada (e aceita atualmente) tem vários problemas, sendo que a sequência qualquer que contém a sequência .h
será impressa, não apenas a aqueles correspondidos na regex no script Awk (assim, por exemplo, a partir de uma referência de membro de estrutura como linkedlist.head
). Eu usaria sed
para isso:
sed -n 's/^"\(.*h\)"$//p "$file" >> Makefile
Tenho uma strong suspeita de que o OP não realmente deseja corresponder a qualquer string que termine com a letra h
entre aspas duplas, que é o que essa expressão regular realmente faz. Talvez um palpite mais razoável seria algo como
sed -n 's/^ *# *include *"\([^"]*\.h\)".*$//p < "$file" >> Makefile
O #include
com espaço em branco opcional antes de ser um palpite. O beef aqui é a expressão regular [^"]*\.h
, que captura uma string que não contém aspas duplas e termina com os caracteres literais .h
.
Com awk
, você pode usar:
awk -F '"' '
/^[[:blank:]]*#[[:blank:]]*include[[:blank:]]+".*\.h"/ {
print $2
}'
Nós definimos o separador de campo como "
, correspondemos a linhas semelhantes a
#include "something.h"
E a partir deles, extraia o segundo campo (então o que está entre o primeiro e o segundo "
).
Tags awk shell-script