空白なしでgrepする方法は何ですか?

空白なしでgrepする方法は何ですか?

大規模なコードベースを検索していますが、スペースやタブが前に表示されるのが面倒です。それを削除する方法はありますか?

grep -R "something" ./

たとえば、次のようになります。

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

私は次のようなものを得たいと思います:

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

またはより良い:

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

答え1

以下を使用して削除できます。sed

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

これにより、出力から先行スペースが削除されます。

答え2

reファイルからパターン(デフォルトの正規表現)を探し、一致するすべての行から先行スペースを削除するとします。

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

(実際には、これは最初にすべての先行スペースを削除してからパターンを探しますが、結果は同じです)

grep編集された質問のように出力を後処理するには、次のようにします。

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

このパターンは、[[:blank:]]*ゼロ以上のスペースまたはタブと一致します。

最後にスペースの代わりにタブを挿入すると、:要求されたインデントが均一に表示されます。

答え3

テストファイルの生成

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

華やかなカラーを演出してくれます:)

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

出力(色を取得するには実行)。

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

テスト対象gnome-terminalkonsole、、、、terminatorxterm

関連情報