Öncü boşluklar olmadan nasıl grep olurum?


17

Ben büyük bir kod tabanı ile haşhaş ve önde gelen whitespace ve tablolama oldukça can sıkıcı görünüyor. Ondan kurtulmanın bir yolu var mı?

grep -R "something" ./

Örneğin:

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

Gibi bir şey almak istiyorum:

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

Ya da daha iyisi:

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

Nereden kurtulun? Çıktıda? Arama modelinde mi?
Ignacio Vazquez-Abrams

@Ignacio, çıktıda. Güncel soru
Andrew

Yanıtlar:


4

Test dosyaları oluşturma

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

tam görkemli renk üretmek :)

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

çıktı (rengi almak için çalıştırın).

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

Test edilmiştir gnome-terminal, konsole, terminator,xterm


iyi iş! küçük bir problem olsa, \tkarakterleri eşleştirmeyi unutuyorsun
Andrew

\t? ... \tSeperatör kullanmıyor, $ '\ x01' (hex 01) kullanıyor ... yoksa başka bir şey mi demek istiyorsun?
Peter.O

Demek istediğim, önde gelen tabloların \tyanı sıra önde gelen boşluklar da olabilir\s
Andrew

... düzeltildi. `` [[:space:]]... olarak değiştirildi: Tüm boşlukları değil, yalnızca SEKME ve BOŞLUK düşünmek istiyorsanız , bunun yerine şunu kullanın:[ \t]
Peter.O

6

Bunları kullanarak bunları ortadan kaldırabilirsiniz. sed

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

Bu, önde gelen boşlukları çıktıdan kaldıracak


1
Bunun herhangi bir etkisi olmayacaktır, çünkü çıktıda herhangi bir satırın başında boşluk yoktur.
Abhishek A

6

reBir dosyada desen (temel bir normal ifade) aradığınızı ve eşleşen tüm satırlardan önde gelen boşlukları kaldırmak istediğinizi varsayarsak :

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

(aslında, bu tüm önde gelen boşlukları sıyırır ve sonra deseni arar, ancak sonuç aynıdır)

Bunun grepyerine çıktıyı sonradan işlemek için (düzenlenen sorunuzda olduğu gibi):

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

Desen, [[:blank:]]*sıfır veya daha fazla boşluk veya sekmeyle eşleşir.


Teşekkürler, son snippet iyi çalışıyor. Çıktı rengini korumanın bir yolu var mı?
Andrew

Renk? Bana eski moda deyin, ama terminalim kesinlikle siyah ve turuncu ... (bu bir "bilmiyorum").
Kusalananda

3
Grep çağrısında --color = always (GNU grep olduğu varsayılarak) kullanın. Sed çağrısı renkleri kaldırmaz, çıkış bir terminale gitmediğinde renk kullanmaz (varsayılan olarak --color = auto). "her zaman" onu her zaman renk kullanmaya zorlar .
Jürgen A. Erhard

@Jurgen, teşekkür ederim, ama --color=alwaysbu normal ifade ile çalışmıyor: /
Andrew

1
Ah, haklısın. Çünkü kolon ve boşluk arasında kontrol dizileri (renk için) vardır. Kaçış dizilerini sed çağrısına koyabilirsiniz (dizi, en azından bir bog standardı vt100 öykünmesi (xterm, ekran, vb.) "\ 033 [m \ 033 [K". Sanırım.; D
Jürgen A Erhard

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.