#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}'