GNU Grep có thể xuất ra một nhóm được chọn không?


47

Có thể sử dụng GNU grep để có được một nhóm phù hợp từ một biểu thức không?

Thí dụ:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Mà sẽ xuất "'bar'". Nhưng tôi muốn chỉ nhận được "thanh", mà không phải gửi nó qua grep thêm một lần nữa (ví dụ: lấy nhóm phù hợp). Điều đó có thể không?

Câu trả lời:


50

Bạn có thể sử dụng sedcho việc này. Trên BSD sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

Hoặc, không có -Etùy chọn:

sed "s/.*'\([^']\+\)'.*/\1/"

Điều này không làm việc cho đầu vào đa dòng. Cho rằng bạn cần:

sed -n "s/.*'\([^']\+\)'.*/\1/p"

Cảm ơn, đã quên về sed. Nhưng để làm rõ, sed không lấy lý lẽ -E ..
Torandi

Hừm, nó hiện trên máy của tôi (Mac OS X). Sau khi kiểm tra thêm, trong trang hướng dẫn: "Các tùy chọn -E, -a và -i là các tiện ích mở rộng FreeBSD không chuẩn và có thể không khả dụng trên các hệ điều hành khác."
jtbandes

1
-r dường như để điều đó cho tôi.
Torandi

1
@jtbandes: Bạn không cần các tính năng mở rộng cho biểu thức này .. Tôi chỉ cần 3 ký tự thoát để ( ) +sử dụng \( \) \+: Điều này thực sự giống nhau:sed "s/.*'\([^']\+\)'.*/\1/"
Peter.O

2
Điều này không làm việc cho đầu vào đa dòng. Cho rằng bạn cần: sed -n "s/.*'\([^']\+\)'.*/\1/p"
phreakhead

28

Mặc dù grep không thể xuất một nhóm cụ thể, bạn có thể sử dụng lookahead và đằng sau các xác nhận để đạt được những gì sau:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"


8
grep -Pkhông có sẵn trên tất cả các nền tảng. Nhưng nếu có, sử dụng lookahead / đằng sau là một cách giải quyết vấn đề rất hay.
Sébastien

1
Là grep thông minh với các xác nhận nhìn phía sau? Làm thế nào để nó thực hiện với cái nhìn dài phía sau? Có phải nó tích hợp cái nhìn phía sau vào một loại "cây hậu tố" nào đó với phần còn lại của regex không?
Ross Rogers

3

Bạn có thể sử dụng \Kđể đặt lại và loại bỏ văn bản khớp bên trái cùng với giao diện không được thêm vào văn bản phù hợp:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

GNU grep chỉ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.