Awk para imprimir apenas a palavra correspondente

1

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
    
por darylnak 19.04.2017 / 23:56

3 respostas

1

Por que awk ? por esta? grep -EPo '[^\s]+\.h[\s]' /path/to/src/*.cpp >> Makefile deve fazer o truque.

    
por 20.04.2017 / 00:42
2

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 .

    
por 20.04.2017 / 05:14
0

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 " ).

    
por 20.04.2017 / 16:41