先頭の空白なしでgrepを実行するにはどうすればよいですか?


17

私は大規模なコードベースを熟読していますが、主要な空白と集計は非常に迷惑なようです。それを取り除く方法はありますか?

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

どこでそれを取り除く?出力で?検索パターンで?
イグナシオバスケス-エイブラムス

@Ignacio、出力。更新された質問
アンドリュー

回答:


4

テストファイルを作成する

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-terminalkonsoleterminatorxterm


よくできました!小さな問題は、しかし、あなたが一致することを忘れ\t文字を
アンドリュー・

\t?... \tセパレーターには使用していません。$ '\ x01'(16進数01)を使用しています...または、別の意味ですか?
Peter.O

私はそこに集計をリードすることができることを意味\tだけでなく、空白をリードする\s
アンドリュー・

... 修繕。に変更されました[[:space:]]... すべての空白ではなく、TABとSPACEのみを考慮したい場合は、代わりにこれを使用してください:[ \t]
Peter.O

6

あなただけを使用してそれらを排除することができます sed

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

それは出力から先頭の空白を削除します


1
出力の行の先頭にスペースがないため、これは効果がありません。
アビシェークA

6

re1つのファイルでパターン(基本的な正規表現)を探していて、一致するすべての行から先頭の空白を削除するとします。

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

(実際には、これは最初にすべての先行空白を取り除き、次にパターンを探しますが、結果は同じです)

grep代わりに出力を後処理するには(編集した質問のように):

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

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


おかげで、最後のスニペットは問題なく動作します。出力色を保持する方法はありますか?
アンドリュー

色?昔ながらの電話と呼んでも、私の端末は完全に黒とオレンジ色です...(「わからない」)。
クサラナナンダ

3
grep呼び出しで--color = always(GNU grepを想定)を使用します。sed呼び出しは色を削除しません。出力が端末に送られないときに色を使用しないgrep自体です(デフォルトは--color = autoです)。「常に」は、常に色を使用するように強制します。
ユルゲンA.エアハルト

@Jurgen、ありがとう、しかし、--color=alwaysこの正規表現では動作しません:/
アンドリュー

1
おっと、あなたは正しい。これは、コロンと空白の間に(色の)制御シーケンスがあるためです。あなたは、sedの呼び出し(シーケンスは、少なくともなど沼地標準のVT100エミュレーション(xtermの、画面、のために、ある)「\ 033 [M \ 033 [K」にエスケープシーケンスを置くことができると思います; D。。
ユルゲン・A 。エアハルト

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.