Nếu bạn có GNU grep, bạn có thể sử dụng -o
tùy chọn của nó để tìm kiếm một biểu thức chính quy và chỉ xuất ra phần phù hợp. (Việc triển khai grep khác chỉ có thể hiển thị toàn bộ dòng.) Nếu có một vài kết quả khớp trên một dòng, chúng được in trên các dòng riêng biệt.
grep -o '\[[0-9]*\]'
Nếu bạn chỉ muốn các chữ số chứ không phải dấu ngoặc thì khó hơn một chút; bạn cần sử dụng một xác nhận có độ rộng bằng 0: một biểu thức chính quy phù hợp với chuỗi rỗng, nhưng chỉ khi nó được đặt trước hoặc theo sau như trường hợp có thể, bằng một dấu ngoặc. Các xác nhận có độ rộng bằng không chỉ có sẵn trong cú pháp Perl.
grep -P -o '(?<=\[)[0-9]*(?=\])'
Với sed, bạn cần tắt in -n
và khớp toàn bộ dòng và chỉ giữ lại phần phù hợp. Nếu có một vài trận đấu có thể có trên một dòng, chỉ có trận đấu cuối cùng được in. Xem Trích xuất regex khớp với 'sed' mà không in các ký tự xung quanh để biết thêm chi tiết về cách sử dụng sed tại đây.
sed -n 's/^.*\(\[[0-9]*\]\).*/\1/p'
hoặc nếu bạn chỉ muốn các chữ số chứ không phải dấu ngoặc:
sed -n 's/^.*\[\([0-9]*\)\].*/\1/p'
Không có grep -o
, Perl là công cụ được lựa chọn ở đây nếu bạn muốn thứ gì đó vừa đơn giản vừa dễ hiểu. Trên mỗi dòng ( -n
), nếu dòng chứa một kết quả khớp \[[0-9]*\]
, thì hãy in kết quả khớp đó ( $&
) và một dòng mới ( -l
).
perl -l -ne '/\[[0-9]*\]/ and print $&'
Nếu bạn chỉ muốn các chữ số, hãy đặt dấu ngoặc đơn trong biểu thức chính quy để phân định một nhóm và chỉ in nhóm đó.
perl -l -ne '/\[([0-9]*)\]/ and print $1'
PS Nếu bạn chỉ muốn yêu cầu một hoặc nhiều chữ số giữa các dấu ngoặc, hãy đổi [0-9]*
thành [0-9][0-9]*
hoặc thành [0-9]+
Perl.
[number]
" có nghĩa là ngoại trừ[0-9]