Làm thế nào để tôi grep mà không có khoảng trắng hàng đầu?


17

Tôi đang lướt qua một cơ sở mã lớn, và các khoảng trắng và bảng xếp hạng hàng đầu dường như khá khó chịu. Có cách nào để thoát khỏi nó?

grep -R "something" ./

Ví dụ: thay vì:

foo/bar.cpp:                       qwertyuiosomethingoi
foo/bar/baz.h:                          43rfsgsomethingdrfg
bar/bar.cpp:            1234edwssomethingczd

Tôi muốn nhận được một cái gì đó như:

foo/bar.cpp: qwertyuiosomethingoi
foo/bar/baz.h: 43rfsgdsomethingrfg
bar/bar.cpp: 1234edwssomethingczd

Hoặc tốt hơn:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

Thoát khỏi nó ở đâu? Trong đầu ra? Trong mô hình tìm kiếm?
Ignacio Vazquez-Abrams

@Ignacio, trong đầu ra. Câu hỏi được cập nhật
Andrew

Câu trả lời:


4

Tạo tập tin kiểm tra

echo -e "\t   foo-somethingfoo" >something.foo
echo "    bar-bar-somethingbar" >something.bar_bar
echo "baz-baz-baz-somethingbaz" >something.baz_baz_baz
echo "  spaces    something  s" >something.spaces

sản xuất đầy đủ màu sắc rực rỡ :)

grep --colour=always "something" something.* | 
 sed -re  's/^([^:]+):(\x1b\[m\x1b\[K)[[:space:]]*(.*)/\1\x01\2\3/' |
   column -s $'\x01' -t

đầu ra (chạy nó để có được màu sắc).

something.bar_bar      bar-bar-somethingbar
something.baz_baz_baz  baz-baz-baz-somethingbaz
something.foo          foo-somethingfoo
something.spaces       spaces    something  s

Thử nghiệm trên gnome-terminal, konsole, terminator,xterm


làm tốt lắm! Tuy nhiên, một vấn đề nhỏ là bạn quên ghép các \tký tự
Andrew

\t? ... Nó không được sử dụng \tcho một người tách biệt, nó đang sử dụng $ '\ x01' (hex 01) ... hoặc bạn có ý gì khác?
Peter.O

Ý tôi là có thể có các bảng xếp hạng hàng đầu \tcũng như các khoảng trắng hàng đầu\s
Andrew

... đã sửa. Đã thay đổi `` thành [[:space:]]... Nếu bạn chỉ muốn xem xét TAB và SPACE, và không phải tất cả khoảng trắng, thay vào đó hãy sử dụng:[ \t]
Peter.O

6

Bạn chỉ có thể loại bỏ chúng bằng cách sử dụng sed

grep blah filename.foo | sed -e 's/^[ \t]*//'

Điều đó sẽ loại bỏ các khoảng trắng hàng đầu khỏi đầu ra


1
Điều này sẽ không có bất kỳ ảnh hưởng nào, vì không có khoảng trắng ở đầu bất kỳ dòng nào trong đầu ra.
Abhishek A

6

Giả sử bạn đang tìm kiếm mẫu re(một biểu thức chính quy cơ bản) trong một tệp và bạn muốn loại bỏ khoảng trắng hàng đầu khỏi tất cả các dòng khớp:

sed -n -e 's/^[[:blank:]]*//' -e '/re/p' thefile.c

(trên thực tế, điều này loại bỏ tất cả các khoảng trắng hàng đầu trước, sau đó tìm mẫu, nhưng kết quả là như nhau)

Để xử lý hậu kỳ grepthay thế đầu ra (như trong câu hỏi đã chỉnh sửa của bạn):

grep re * | sed 's/:[[:blank:]]*/: /'

Mẫu [[:blank:]]*phù hợp với không hoặc nhiều khoảng trắng hoặc tab.


Cảm ơn, đoạn cuối hoạt động tốt. Có cách nào để giữ màu đầu ra?
Andrew

Màu sắc? Gọi tôi là lỗi thời, nhưng thiết bị đầu cuối của tôi hoàn toàn màu đen và cam ... (đó là "Tôi không biết").
Kusalananda

3
Sử dụng --color = always (giả sử GNU grep) trong lệnh gọi grep. Cuộc gọi sed không xóa màu, chính grep không sử dụng màu khi đầu ra không đi đến thiết bị đầu cuối (với mặc định là --color = auto). "Luôn luôn" buộc nó, tốt, luôn luôn sử dụng màu sắc.
Jürgen A. Erhard

@Jurgen, cảm ơn bạn, nhưng với regrec --color=alwaysnày không hoạt động: /
Andrew

1
Oh shucks, bạn đúng. Đó là bởi vì có các chuỗi điều khiển (cho màu sắc) giữa dấu hai chấm và khoảng trắng. Bạn có thể đặt các chuỗi thoát vào lệnh gọi sed (chuỗi này, ít nhất là đối với mô phỏng vt100 tiêu chuẩn bog (xterm, màn hình, v.v.) "\ 033 [m \ 033 [K". Tôi nghĩ .; D
Jürgen A Erhard

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.