没有前导空格的情况下如何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,输出中。更新的问题
安德鲁

Answers:


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字符
Andrew

\t?...它不是\t用于分隔符,它是使用$'\ x01'(十六进制01)...或者您是说其他意思吗?
Peter.O 2011年

我的意思是可能会有领先的制表\t和领先的空格\s
Andrew

...固定。更改为[[:space:]]...如果只想考虑TAB和SPACE而不是所有空格,请改用它:[ \t]
Peter.O 2012年

6

您可以使用消除它们 sed

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

这将从输出中删除前导空格


1
这不会有任何效果,因为输出中任何一行的开头都没有空格。
Abhishek

6

假设您要re在一个文件中查找模式(基本正则表达式),并且想要从所有匹配行中删除前导空格:

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),它本身不使用颜色。“总是”强制它始终使用颜色。
尔根·艾哈德

@Jurgen,谢谢,但是使用--color=always此正则表达式不起作用:/
Andrew

1
哎呀,你是对的。这是因为冒号和空白之间存在控制序列(针对颜色)。你可以把转义序列进入sed的调用(顺序是,至少在沼泽标准VT100仿真(xterm中,屏等)“\ 033 [M \ 033 [K”我想; d
于尔根一Erhard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.