it-swarm-vi.com

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

Có thể sử dụng GNU grep để nhận 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 một lần nữa (ví dụ: lấy nhóm phù hợp). Điều đó có thể không?

46
Torandi

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

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

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

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"
49
jtbandes

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 "(?<=')[^']+(?=')"

28
Aldrik

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 khớp:

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

GNU grep chỉ.

2
drewk