如何在没有前导空格的情况下进行 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-terminal, konsole, terminator,xterm

相关内容