Vì bạn cần đối sánh nội dung mà không đưa nội dung đó vào kết quả (phải khớp name="
nhưng nó không phải là một phần của kết quả mong muốn) nên bắt buộc phải có một số hình thức đối sánh chiều rộng bằng 0 hoặc chụp nhóm. Điều này có thể được thực hiện dễ dàng với các công cụ sau:
Perl
Với Perl, bạn có thể sử dụng n
tùy chọn để lặp lại từng dòng và in nội dung của một nhóm chụp nếu nó khớp:
perl -ne 'print "$1\n" if /name="(.*?)"/' filename
GNU grep
Nếu bạn có phiên bản grep cải tiến, chẳng hạn như GNU grep, bạn có thể có -P
tùy chọn. Tùy chọn này sẽ kích hoạt Perl-like regex, cho phép bạn sử dụng \K
cái nhìn ngắn gọn. Nó sẽ đặt lại vị trí khớp, vì vậy bất kỳ thứ gì trước nó đều có độ rộng bằng không.
grep -Po 'name="\K.*?(?=")' filename
Các o
làm cho tùy chọn grep chỉ in văn bản phù hợp, thay vì toàn bộ dòng.
Vim - Trình soạn thảo văn bản
Một cách khác là sử dụng trình soạn thảo văn bản trực tiếp. Với Vim, một trong những cách khác nhau để thực hiện điều này là xóa các dòng không có
name=
và sau đó trích xuất nội dung từ các dòng kết quả:
:v/.*name="\v([^"]+).*/d|%s//\1
Grep tiêu chuẩn
Nếu bạn không có quyền truy cập vào các công cụ này, vì lý do nào đó, có thể đạt được điều gì đó tương tự với grep tiêu chuẩn. Tuy nhiên, nếu không xem xét xung quanh, nó sẽ yêu cầu một số dọn dẹp sau:
grep -o 'name="[^"]*"' filename
Lưu ý về việc lưu kết quả
Trong tất cả các lệnh trên, kết quả sẽ được gửi đến stdout
. Điều quan trọng cần nhớ là bạn luôn có thể lưu chúng bằng cách chuyển nó vào một tệp bằng cách thêm:
> result
đến cuối lệnh.