grep hành vi lạ với các từ đơn


10

Tôi đang xóa các từ dừng khỏi một văn bản, đại khái là sử dụng này

Tôi có những điều sau đây

$ cat file
file
types
extensions

$ cat stopwords
i
file
types

grep -vwFf stopwords file

Tôi đang mong đợi kết quả: extensions

nhưng tôi nhận được (tôi nghĩ không chính xác)

file
extensions

Như thể từ fileđã bị bỏ qua trong tập tin mật khẩu. Bây giờ đây là chút mát: nếu tôi sửa đổi các tập tin từ dừng, bằng cách thay đổi từ đơn / thư itrên dòng đầu tiên, đối với bất kỳ chữ cái ascii khác ngoài f, i, l, e, sau đó lệnh cùng grep mang lại cho tôi một kết quả khác nhau và đúng extensions.

Điều gì đang xảy ra ở đây và làm thế nào để tôi sửa chữa nó?

Tôi đang sử dụng grep (BSD grep) 2.5.1-FreeBSD trên bash Mac OSX GNU, phiên bản 4.4.12 (1)


Bạn có thể muốn sử dụng -xchuyển đổi cho regex dòng thay vì -wcho từ? Tuy nhiên, tôi nghĩ rằng công -Ftắc sẽ hủy bỏ một trong hai hoặc ngược lại.
jesse_b

grep (GNU grep) 3.1 hoạt động như bạn mong đợi.
Hauke ​​Laging

Tôi đã nhân rộng điều này. Một mốc thời gian khác: Tạo imẫu thứ hai thay vì mẫu thứ nhất trong stopwordstệp cũng làm thay đổi hành vi.
JdeBP

Tôi không thể tái tạo hành vi trên OpenBSD 6.2 bằng bản gốc grepcũng như với GNU grep3.1.
Kusalananda

Câu trả lời:


13

Đây là một lỗi trong bsdgrep, liên quan đến một biến theo dõi một phần của dòng hiện tại để quét được ghi đè bằng các lệnh gọi liên tiếp đến công cụ khớp biểu thức chính quy khi có nhiều mẫu.

sửa chữa cục bộ

Bạn có thể giải quyết vấn đề này ở một mức độ nào đó bằng cách không sử dụng -wtùy chọn, điều này phụ thuộc vào biến này để thao tác chính xác và do đó không thành công, nhưng thay vào đó sử dụng các phần mở rộng biểu thức thông thường khớp với phần đầu và phần cuối của từ, làm cho stopwordstệp của bạn trông như sau:

\ <i \>
\ <tập tin \>
\ <loại \>

Cách giải quyết này cũng sẽ yêu cầu bạn không sử dụng -Ftùy chọn.

Lưu ý rằng các tài liệu thành phần biểu thức chính quy [[:<:]][[:>:]]rằng re_formatthủ nói với bạn về sẽ không làm việc ở đây. Điều này là do thư viện biểu thức chính quy được biên dịch thành bsdgrepđã bật hỗ trợ tương thích biểu thức chính quy GNU. Đây là một lỗi khác, được báo cáo là đã sửa.

sửa chữa dịch vụ

Lỗi này đã được sửa vào đầu năm nay. Bản sửa lỗi chưa biến nó thành các hương vị ỔN ĐỊNH hoặc ĐÁNG TIN CẬY của FreeBSD, nhưng được báo cáo trong HIỆN TẠI.

Để đưa phiên bản này vào phiên bản MacOS grep, có nguồn gốc từ FreeBSD bsdgrep, vui lòng tham khảo ý kiến ​​của Apple. ☺

đọc thêm


Đẹp, và cảm ơn vì đã báo cáo ngược dòng này. Tôi sẽ tìm thấy câu trả lời này thậm chí còn hấp dẫn hơn nếu nó trích dẫn mã lỗi.
dhag

1

Mã này:

pl " Input data file data1 and stopwords file data2:"
head data1 data2

pl " Expected output:"
cat $E

pl " Results, grep:"
# grep -vwFf stopwords file
grep -vwFf data2 data1

pl " Results, cgrep:"
cgrep -x1 -vFf data2 data1

sản xuất:

-----
 Input data file data1 and stopwords file data2:
==> data1 <==
file
types
extensions

==> data2 <==
i
file
types

-----
 Expected output:
extensions

-----
 Results, grep:
file
extensions

-----
 Results, cgrep:
extensions

Trên một hệ thống như:

OS, ker|rel, machine: Apple/BSD, Darwin 16.7.0, x86_64
Distribution        : macOS 10.12.6 (16G29), Sierra
bash GNU bash 3.2.57

Thêm chi tiết về cgrep, có sẵn thông qua bia và từ sourceforge:

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : Mach-O64-bitexecutablex86_64 ...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

chúc mừng, drl


chỉ cần có cho mình một grep mới.
Tim

@Tim - Tôi hy vọng bạn thấy cgrep hữu ích như tôi có. Tốc độ trong các bài kiểm tra tôi đã thực hiện đặt nó ngang bằng với GNU grep và các tính năng "bối cảnh / cửa sổ" rất hữu ích. Nó cũng dễ dàng xây dựng trên các hệ thống Linux ... chúc mừng, drl
drl
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.