Với gawk
, bạn có thể sử dụng chức năng phù hợp:
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
Nếu bạn là ok với perl
, giải pháp linh hoạt hơn: Sau sẽ in ba nhân vật trước khi mô hình tiếp theo mô hình thực tế và sau đó 5 nhân vật sau khi mẫu .
echo hey there how are you |perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
này cũng có thể được áp dụng cho những lời thay vì chỉ characters.Following sẽ in một từ trước chuỗi phù hợp thực tế.
echo hey there how are you |perl -lne 'print $1 if /(\w+) there/'
hey
Tiếp theo sẽ in một từ sau khi mẫu:
echo hey there how are you |perl -lne 'print $2 if /(\w+) there (\w+)/'
how
Tiếp theo sẽ in một từ trước khi mô hình, sau đó từ thực tế và sau đó một từ sau khi mẫu:
echo hey there how are you |perl -lne 'print "$1$2$3" if /(\w+)(there)(\w+)/'
hey there how
Nguồn
2017-03-14 11:25:08
Câu trả lời hay cho một lượng nhỏ dữ liệu, nhưng nó bắt đầu chậm khi bạn so khớp> 100 ký tự - ví dụ: trong tệp xml khổng lồ của tôi, tôi muốn {1,200} trước và sau, và nó quá chậm để sử dụng. – Benubird
Phiên bản awk của @amit_g nhanh hơn nhiều. – ssobczak
Không có trên Mac OSX, vì vậy đây thực sự không phải là giải pháp có sẵn rộng rãi. Phiên bản -E (được liệt kê dưới đây) là một giải pháp tốt hơn. -P là gì? Đọc trên ... -P, --perl-regexp Giải thích MẪU như một biểu thức chính quy Perl (PCRE, xem bên dưới). Điều này là rất thử nghiệm và grep-P có thể cảnh báo về các tính năng chưa được thực hiện. – Xofo