O grep trata todas as linhas independentemente, por isso não pode fazer o trabalho sozinho.
Awk é uma ferramenta geral de processamento de texto. Mantenha o controle de qual é o pacote atual (na variável p
) e imprima uma correspondência se uma linha requires:
for encontrada no pacote correto (removendo o prefixo requires:
).
<setup.ini awk -vpackage='NAME_OF_PACKAGE' '
sub(/^@ */,"") {p=$0}
p==package && sub(/^requires: */,"") {print}
'
Outra abordagem do awk é processar entradas delimitadas por sequências newline- @
em vez de novas linhas. Ou, como as seções do pacote têm uma linha em branco entre elas, processe input por parágrafo: passe uma string vazia como o separador de registro RS
(o que significa que os registros são separados por uma ou mais linhas em branco). Em seguida, para cada linha no registro procurado, se a linha começar com requires:
, imprima-a (menos o prefixo).
<setup.ini awk -vpackage='NAME_OF_PACKAGE' -vRS= -vFS='\n' '
sub(/^@ */,"") && $1==package {
for (i=2; i<NF; i++) {if (sub(/^requires: */,"",$i)) print $i}
}'
Outra possibilidade é o modo de parágrafo do Perl ( -00
). Se o parágrafo começar com o cabeçalho direito ( /REGEXP/m
significa uma correspondência multilinha, para que $
âncora signifique fim de linha em vez de fim de seqüência) e contenha uma linha requires:
, imprima essa linha (menos o prefixo).
<setup.ini package=NAME_OF_PACKAGE perl -00 -ne '
/\A@ *$ENV{package}$/m and /^requires: *(.*)$/m and print "$1\n"'
E aqui está uma para os amantes do sed (GNU). (Você não é esperado para entender isso.)
sed -ne '/^@/ { h; b; }; G; s/^requires: *\(.*\)\n@ *NAME_OF_PACKAGE$//p'