En supposant que vous souhaitiez faire correspondre toute la ligne à votre modèle, avec GNU sed
, cela fonctionne:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Équivalent standard:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Avec l'entrée suivante ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
La sortie est:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Explication:
/^dog 123 4335$/
recherche le motif désiré.
:a; n; p; ba;
est une boucle qui extrait une nouvelle ligne de input ( n
), l’imprime ( p
) et la ramène à l’étiquette a :a; ...; ba;
.
Mise à jour
Voici une réponse qui se rapproche de vos besoins, c'est-à-dire un motif dans file2, en allant de fichier1
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
Les commandes grep et cut incorporées trouvent la première ligne contenant un motif de fichier2, ce numéro de ligne plus un est transmis à la fin, le plus un permettant de sauter la ligne contenant le motif.
Si vous voulez commencer à partir du dernier match au lieu du premier, ce serait:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Notez que toutes les versions de tail ne prennent pas en charge la notation plus.