hành vi khoảng trắng grep regex


87

Tôi có một tệp văn bản, chứa một cái gì đó như:

12,34 EUR 
 5,67 EUR
 ...

Có một khoảng trắng trước 'EUR' và tôi bỏ qua 0, XX EUR.

Tôi đã thử:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

Ai đó có thể giải thích cho tôi, tại sao tôi không thể sử dụng \snhưng \s*\s[E]phù hợp?

Hệ điều hành: Ubuntu 10.04, grep v2.5

Câu trả lời:


122

Điều này có vẻ như là một sự khác biệt về hành vi trong việc xử lý \sgiữa phiên bản grep 2.5 và các phiên bản mới hơn (một lỗi trong grep cũ?). Tôi xác nhận kết quả của bạn với grep 2.5.4, nhưng cả bốn grep của bạn đều hoạt động khi sử dụng grep 2.6.3 (Ubuntu 10.10).

Ghi chú:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

trong khi

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

Có lẽ ít rắc rối hơn (như \skhông được ghi lại):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

Lời khuyên của tôi là tránh sử dụng \s... sử dụng [ \t]*hoặc [[:space:]]hoặc một cái gì đó tương tự để thay thế.


24
Hoặc chỉ [:space:], cho người yêu cũ. như thế này:cat file | grep "[[:space:]]"
Kiril Kirov,

nó có vẻ là một lỗi trong phiên bản grep mới hơn (theo quan điểm khác) theo yêu cầu lỗi này mail-archive.com/bug-grep@gnu.org/msg02686.html nhưng tại sao câu lệnh cuối cùng lại khớp?
Milde

1
@Milde, lưu ý bài đăng tiếp theo mail-archive.com/bug-grep@gnu.org/msg02689.html nơi báo cáo lỗi đó được đánh dấu là không hợp lệ và đã bị đóng (vì vậy đây không được coi là lỗi trong grep mới hơn).
Kamal

2
@Milde, không có tài liệu grep nào mà tôi đã kiểm tra (cũ hay mới) thực sự đề cập đến \s. Tôi muốn nói rằng hành vi của nó là "không xác định". Thay vào đó, hãy sử dụng [: space:], hoạt động như được ghi lại trong grep cũ và mới.
Kamal

cảm ơn, tôi sẽ sử dụng [: space:] trong tương lai để tránh những vấn đề
MILDE
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.