Supondo que você queira combinar toda a linha com seu padrão, com o GNU sed
, isso funciona:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Equivalente padrão:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Com a seguinte entrada ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
A saída é:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Explicação:
/^dog 123 4335$/
procura o padrão desejado.
:a; n; p; ba;
é um loop que busca uma nova linha de input ( n
), imprime ( p
) e ramifica de volta para rotular a :a; ...; ba;
.
Atualizar
Aqui está uma resposta que se aproxima mais de suas necessidades, ou seja, padrão no arquivo2, grepping no arquivo1:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
O grep and cut incorporado encontra a primeira linha que contém um padrão do arquivo2, esse número de linha mais um é passado para o final, o mais existe para pular a linha com o padrão.
Se você deseja começar da última partida em vez da primeira, seria:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Observe que nem todas as versões da cauda suportam a notação positiva.