2012-03-16 30 views
6

tôi có những dòng nhưLàm thế nào để tìm các dòng có chứa nhiều hơn một khoảng trắng giữa các chuỗi trong unix?

1|Harry|says|hi 
2|Ron|says|bye 
3|Her mi oh ne|is|silent 
4|The|above|sentence|is|weird 

Tôi cần một lệnh grep rằng sẽ phát hiện dòng thứ ba.

Đây là những gì Im đang thực hiện.

grep -E '" "" "+' $dname".txt" >> $dname"_error.txt" 

Logic mà trên cơ sở đó, khoảng trắng đầu tiên phải được theo sau bởi một hoặc nhiều khoảng trắng được phát hiện là lỗi.

$ dname là biến chứa đường dẫn tên tệp.

Làm cách nào để có được kết quả mong muốn?

(đó là

 3|Her mi oh ne|is|silent 

)

Trả lời

4

Chỉ cần điều này sẽ làm:

grep " " ${dname}.txt >> ${dname}_error.txt 

Hai không gian trong một công việc tốt chuỗi trích dẫn. Các -E biến mô hình thành một biểu thức chính quy mở rộng, mà làm cho điều này không cần thiết phức tạp ở đây.

+0

'-E' biến mẫu thành biểu thức chính quy mở rộng, mẫu grep luôn luôn regexes, trừ khi tùy chọn' -F' được đưa ra. – huon

+1

Do đó tên. Yeah, tôi trượt lên; đã chỉnh sửa. –

7
grep '[[:space:]]\{2,\}' ${dname}.txt >> ${dname}_error.txt 

Nếu bạn muốn bắt 2 hoặc nhiều khoảng trắng.

+0

đây là câu trả lời chung và do đó phải được chấp nhận ... –

0

Nếu bạn muốn 2 hoặc nhiều không gian, sau đó:

grep -E "\s{2,}" ${dname}.txt >> ${dname}_error.txt 

Lý do tại sao mô hình của bạn không hoạt động là do có dấu ngoặc kép bên trong. \s được sử dụng cho [không gian]. Bạn thực sự có thể làm điều tương tự với:

grep -E ' +' ${dname}.txt >> ${dname}_error.txt 

Nhưng thật khó để nói chính xác những gì bạn đang tìm kiếm với phiên bản đó. \s\s+ cũng sẽ hoạt động, nhưng \s{2,} là ngắn gọn nhất và cũng cung cấp cho bạn tùy chọn đặt giới hạn trên. Nếu bạn muốn tìm 2, 3 hoặc 4 dấu cách liên tiếp, bạn sẽ sử dụng \s{2,4}

+0

Hey Im xin lỗi nhưng điều này doesnt work.I sẽ cần phải cố gắng và sửa chữa nó .. – wave5459

+0

Cả hai đều đã được thử nghiệm và làm việc trên grep (GNU grep) 2.9. Phiên bản bạn đang sử dụng? –

+0

Methinks bạn có thể cần phải xem xét lại định nghĩa của bạn về "súc tích" :-) – paxdiablo

1

dưới đây là bốn cách.

pearl.268> sed -n 's/ /&/p' ${dname}.txt >> ${dname}_error.txt 
pearl.269> awk '$0~/ /{print $0}' ${dname}.txt >> ${dname}_error.txt 
pearl.270> grep ' ' ${dname}.txt >> ${dname}_error.txt 
pearl.271> perl -ne '//&& print' ${dname}.txt >> ${dname}_error.txt 
Các vấn đề liên quan