Предполагая, что вы хотите сопоставить всю строку с вашим шаблоном, с GNU sed
это работает:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Стандартный эквивалент:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Со следующим вводом ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Выход:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Объяснение:
/^dog 123 4335$/
ищет нужный шаблон.
:a; n; p; ba;
является циклом, который выбирает новую строку из input ( n
), печатает ее ( p
) и переходит обратно к метке a :a; ...; ba;
.
Обновить
Вот ответ, который приближается к вашим потребностям, то есть шаблон в файле file2, извлеченный из файла file1:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
Внедренные grep и cut находят первую строку, содержащую шаблон из файла file2, этот номер строки плюс один передается на хвост, плюс один, чтобы пропустить строку с шаблоном.
Если вы хотите начать с последнего матча, а не с первого, это будет:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Обратите внимание, что не все версии tail поддерживают добавочную нотацию.