grep với đầu ra màu trả về một số dòng trống


5

Tôi có vấn đề lạ với grep (2.12-2, thử nghiệm debian).

Trong một số tình huống khi tôi làm một cái gì đó như thế này: grep -rni '."spacer">.' .grep trả lại cho tôi một số dòng trống:

nhập mô tả hình ảnh ở đây

Nếu tôi thêm --color=nonetất cả các dòng trở nên nhìn thấy.

tùy chọn grep trong .bashrc:

export GREP_COLORS='fn=01;34:ms=01;33:ln=33'
alias grep='grep --color=auto'

Bạn có thể đăng một tập tin tối thiểu gây ra hành vi này? Bằng cách đó chúng ta có thể kiểm tra xem liệu chúng ta có gặp vấn đề tương tự không. Là các dòng thực sự được in trong thiết bị đầu cuối của bạn? Chúng có xuất hiện nếu bạn chọn chúng không?
terdon

Không, dòng không được in thực sự. Vui lòng kiểm tra tệp: sendspace.com/file/39ouyh và các tùy chọn grep: grep -rni '. "Spacer">.'
bảo hiểm

Câu trả lời:


7

Một công cụ rất hữu ích để gỡ lỗi loại điều này là od. Truyền đầu ra của greplệnh thông qua odcho thấy tệp của bạn chứa các kết thúc dòng kiểu DOS, return return ( \r) theo sau là một dòng mới ( \n):

$ grep -i '."spacer">.' default.php | od -c
0000000  \t  \t  \t  \t  \t   <   d   i   v       c   l   a   s   s   =
0000020   "   s   p   a   c   e   r   "   >  \r  \n  \t  \t  \t   <   d
0000040   i   v       c   l   a   s   s   =   "   s   p   a   c   e   r
0000060   "   >  \r  \n
0000064

Vì vậy, để kiểm tra, tôi đã tạo tệp thử nghiệm tối thiểu này:

$ echo -ne "<div class=\"spacer\">\r\n<div class=\"spacer\">\r\n" > foo.php
$ cat foo.php 
<div class="spacer">
<div class="spacer">

Tôi xác nhận rằng grepin các dòng trống:

$ grep -i '."spacer">.' foo.php 


$

Các lý do nó được in dòng sản phẩm nào là sự trở lại vận chuyển ( \r). Bạn đang yêu cầu greptìm chuỗi spacer"> và ký tự sau . Trong tập tin của bạn, ký tự sau đây là \r. In \rtrong thiết bị đầu cuối có tác dụng xóa dòng cuối cùng được in để nó hiển thị một dòng trống. Bạn có thể kiểm tra điều này bằng lệnh sau:

$ echo -e "foo\rbar"
bar

Điều thực sự xảy ra là đầu tiên foođược in, sau đó bị xóa vì \rvà được thay thế bởi bar. Kiểm tra với od:

$ echo -e "foo\rbar" | od -c
0000000   f   o   o  \r   b   a   r  \n
0000010

Bây giờ, tôi không hiểu tại sao colorstùy chọn grepthay đổi mọi thứ. Nó phải có một cái gì đó để làm với cách hiển thị các ký tự đặc biệt. Trong mọi trường hợp, bạn có thể khắc phục sự cố của mình bằng cách xóa tất cả \r:

$ sed 's/\r//g' default.php > bar.php

Sau đó, xóa cái cuối cùng .khỏi mẫu grep của bạn (hãy nhớ rằng theo mặc định .không khớp với dòng mới mặc dù nó không khớp \r):

$ grep -ni '."spacer">' bar.php 
103:                <div class="spacer">
222:            <div class="spacer">

1
Cảm ơn bạn rất nhiều, rất thú vị. Có thể báo cáo báo cáo lỗi cho vấn đề này?
bảo hiểm

@Sloan nó không thực sự là một lỗi, đó là những gì \rphải làm.
terdon

2
Có thể, nhưng nếu đây không phải là lỗi, tại sao --color = auto / luôn luôn xuất sai?
bảo hiểm

2
Tôi rất muộn. Lỗi rất cũ savannah.gnu.org/bugs/?25539
bảo hiểm
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.