2010-01-30 28 views
41

Tôi có một tệp văn bản có tên compare.txt mà tôi muốn trích xuất một dòng duy nhất theo sau mỗi dòng có chứa mẫu "nmse_gain_constant". Lệnh sau đây cho tôi đóng:Làm cách nào để loại bỏ dấu phân cách dòng "-" khi sử dụng grep với dòng ngữ cảnh?

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant 

Nhưng điều này bao gồm dấu phân tách "-" giữa mỗi dòng văn bản mong muốn. Bất kỳ ý tưởng dễ dàng làm thế nào để thoát khỏi các dòng "-"?

Tôi sẽ cung cấp cho bạn một số văn bản ví dụ tại đây, nhưng ký tự "-" bị bài đăng web này hiểu sai là ký tự điều khiển và những gì bạn thấy là không chính xác.

Trả lời

3

Một giải pháp sẽ là:

grep -A 1 nmse_gain_constant compare.txt | grep -v nmse_gain_constant | grep -v "\-\-" 
+0

Tính năng này hoạt động tốt. Cảm ơn! – Michael

16

Vâng, A chuyển đổi theo mặc định sẽ bổ sung thêm những nhân vật, vì vậy nó không có gì bí ẩn.

man grep trạng thái:

-A NUM 

    Places a line containing a group separator (--) between 
    contiguous groups of matches. With the -o or --only-matching 
    option, this has no effect and a warning is given. 

Nhưng bạn có thể sử dụng một sed đơn giản để dọn dẹp hậu quả:

yourgrep | sed '/^--$/d' 
+0

Công trình này tuyệt vời. Cảm ơn bạn. – Michael

6

Không cần đến ống để rất nhiều greps hoặc sử dụng các công cụ khác (ví ví dụ, sed) nếu bạn sử dụng AWK:

awk '/nmse_gain_constant/{getline;print }' compare.txt 
+1

để sử dụng grep -B: awk '/ regex/{print x; print}; {x = $ 0} ' –

+0

giải thích về đường giới hạn; phần in của lệnh awk sẽ phù hợp với câu trả lời này vì hầu hết mọi người cố gắng grep khi họ nên không quen với biểu thức awk được sử dụng để có được kết quả tương đương grep – Steen

21

Có tham số không có giấy tờ của grep: "--group-separa tor ", ghi đè mặc định" - ". Bạn có thể đặt nó thành "" để loại bỏ dấu gạch ngang kép. Mặc dù, bạn vẫn nhận được một dòng trống. Tôi đã gặp rắc rối tương tự, và tìm thấy param này bằng cách đọc mã nguồn của grep.

+9

Bạn có thể use --no-group-separator (xem bên dưới) –

+0

ngay cả khi tôi đặt '--group-separator =" "', bộ tách nhóm không thực sự trống, nhưng vẫn được tô màu. Vì vậy, thay vì một dòng trống, đường phân cách chứa mã màu, tức là '[[36m [[K [[m [[K'. Có cách nào để vô hiệu hóa màu của dấu phân cách, trong khi vẫn giữ grep '--color = always'? –

+1

không có tùy chọn như vậy trên mac cho 'grep (BSD grep) 2.5.1-FreeBSD' – Tim

62

Tôi làm điều này:

grep ... | grep -v -- "^--$" 

Nhưng công trình này quá!

grep --no-group-separator ... 

Và nó không nhổ ra "-" hoặc thậm chí một dòng trống.

+9

'grep: tùy chọn không được công nhận '--no-group-separator'' trên Mac OS X – krookedking

+0

Tính năng này hoạt động trên Linux, RHEL 6.8 phải cụ thể. – cryptic0

Các vấn đề liên quan