grep和tabs:不匹配

#cat sample 1 -1 2 2 2 2 2 1-1 3 

我需要得到所有包含负值的行,也就是第一行。 值以制表符分隔。 首先我尝试了

 # grep "\-1" sample 1 -1 2 2 1-1 3 

但是,如果我尝试

  grep "\t\-1" sample 

我什么也没得到(不匹配)。 我究竟做错了什么?

在Bash中,你可以这样做:

 grep $'\t-1' sample 

$''导致逃生被解释。

没有必要摆脱减号。

尝试像这样:

 grep -P '\t-1' sample 

顺便说一句,你提供的样本是缩进的。 你可以尝试以下的通用空白匹配:

 grep -P '\s-1' sample 

基本正则expression式中没有设置标签(由man 7 regex描述)。 正如Georgi Hristozov指出的那样,你可以使用Perl Compatible Regular Expressions来获得这个能力。 grep的一些实现不支持-P,但其他基本工具将会有更丰富的正则expression式语言,下面是一些应该工作的例子:

 sed -n '/\t-/p' sample awk '/\t-/' sample perl -ne '/\t-/ && print' sample 

为了得到它正常的grep工作(不使用pcre),你将不得不把你的正则expression式中的文字标签expression式。 在许多使用tab键完成的shell中,可以使用Ctrl-v<tab>来获得一个stringCtrl-v<tab> 。 所以你可以input:

 grep 'Ctrl-v<tab>-' sample 

检查man 7 regex则expression式可以使用POSIX正则expression式,而PCRE的-P被许多地方支持,而且它在任何地方都不可用(而手册页说它的bug,所以我不总是相信它自己)POSIX的应该工作在更多的地方。

你可以尝试这样的事情:

 grep "^[[:digit:]]\+[[:space:]]\+-" 

^匹配行的开头。
[[:digit:]]\+匹配一个或多个数字。
[[:space:]]\+匹配一个或多个空格字符。
-最后匹配你正在寻找的负值。

正则expression式手册页(7): http : //linux.die.net/man/7/regex

可选scheme

你也可以使用awk来做到这一点(当然还有其他工具)。 这是一个awk示例,打印第二列小于0(负)的行:

 awk '{if ($2 < 0) print}'