Bagaimana cara saya melakukan grep tanpa memimpin spasi putih?


17

Saya memahami basis kode yang besar, dan memimpin spasi putih dan tabulasi tampaknya cukup menjengkelkan. Apakah ada cara untuk menghilangkannya?

grep -R "something" ./

Misalnya, alih-alih:

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

Saya ingin mendapatkan sesuatu seperti:

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

Atau lebih baik:

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

Singkirkan itu dimana? Dalam output? Dalam pola pencarian?
Ignacio Vazquez-Abrams

@Ignacio, dalam output. Pertanyaan yang diperbarui
Andrew

Jawaban:


4

Buat file uji

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

menghasilkan warna yang sangat indah :)

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

output (jalankan untuk mendapatkan warna).

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

Diuji di gnome-terminal, konsole, terminator,xterm


kerja bagus! sedikit masalah, Anda lupa untuk mencocokkan \tkarakter
Andrew

\t? ... Itu tidak menggunakan \tuntuk pemisah, itu menggunakan $ '\ x01' (hex 01) ... atau maksud Anda sesuatu yang lain?
Peter.O

Maksud saya mungkin ada tabulasi \tterkemuka dan spasi putih terkemuka\s
Andrew

... diperbaiki. Diubah `` menjadi [[:space:]]... Jika Anda hanya ingin mempertimbangkan TAB dan SPACE, dan tidak semua spasi putih, gunakan ini sebagai gantinya:[ \t]
Peter.O

6

Anda bisa menghilangkannya menggunakan sed

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

Itu akan menghapus spasi putih terkemuka dari output


1
Ini tidak akan berpengaruh apa pun, karena tidak ada spasi di awal baris apa pun di output.
Abhishek A

6

Dengan asumsi Anda sedang mencari pola re(ekspresi reguler dasar) dalam satu file, dan Anda ingin menghapus spasi kosong dari semua baris yang cocok:

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

(sebenarnya, ini mengupas semua spasi putih pertama, dan kemudian mencari polanya, tetapi hasilnya sama)

Sebagai grepgantinya pasca-proses output (seperti dalam pertanyaan Anda yang diedit):

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

Pola tersebut [[:blank:]]*cocok dengan nol atau lebih banyak spasi atau tab.


Terima kasih, potongan terakhir berfungsi dengan baik. Apakah ada cara untuk mempertahankan warna output?
Andrew

Warna? Panggil saya kuno, tetapi terminal saya benar-benar hitam dan oranye ... (itu adalah "Saya tidak tahu").
Kusalananda

3
Gunakan --color = selalu (dengan asumsi GNU grep) pada panggilan grep. Panggilan sed tidak menghilangkan warna, itu grep sendiri yang tidak menggunakan warna ketika output tidak pergi ke terminal (dengan default --color = auto). "selalu" memaksanya untuk, yah, selalu menggunakan warna.
Jürgen A. Erhard

@Jurgen, terima kasih, tetapi dengan --color=alwaysregexp ini tidak berfungsi: /
Andrew

1
Oh sial, kau benar. Itu karena ada urutan kontrol (untuk warna) antara titik dua dan spasi putih. Anda dapat memasukkan urutan escape ke dalam panggilan sed (urutannya, setidaknya untuk emulasi vt100 standar-rawa (xterm, layar, dll.) "\ 033 [m \ 033 [K". Saya pikir.; D
Jürgen A Erhard

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.