Giả sử bạn muốn khớp toàn bộ dòng với mẫu của bạn, với GNU sed
, điều này hoạt động:
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
Tương đương tiêu chuẩn:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
Với đầu vào sau ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Đầu ra là:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Giải trình:
/^dog 123 4335$/
tìm kiếm các mẫu mong muốn.
:a; n; p; ba;
là một vòng lặp tìm nạp một dòng mới từ input ( n
), in nó ( p
) và các nhánh trở lại nhãn a :a; ...; ba;
.
Cập nhật
Đây là một câu trả lời gần hơn với nhu cầu của bạn, tức là mẫu trong tệp2, lấy từ tệp1:
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
Grep được nhúng và cắt tìm dòng đầu tiên chứa mẫu từ tệp2, số dòng này cộng với một dòng được truyền vào đuôi, dấu cộng có ở đó để bỏ qua dòng có mẫu.
Nếu bạn muốn bắt đầu từ trận đấu cuối cùng thay vì trận đấu đầu tiên thì đó sẽ là:
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
Lưu ý rằng không phải tất cả các phiên bản đuôi đều hỗ trợ ký hiệu cộng.