grep 和 tabs:无匹配

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

我什么都没得到(没有匹配)。我做错了什么?

答案1

在 Bash 中,你可以这样做:

grep $'\t-1' sample

$''原因尚待解释。

没有必要对减号进行转义。

答案2

尝试以下方法:

grep -P '\t-1' sample

顺便说一句,您提供的示例是制表符缩进的。您可以尝试以下方法进行通用空格匹配:

grep -P '\s-1' sample

答案3

在基本正则表达式(由 描述的那些)中,没有将 \t 用作制表符的功能man 7 regex。正如 Georgi Hristozov 指出的那样,您可以使用 Perl 兼容正则表达式来获得此功能。grep 的某些实现不支持 -P,但其他基本工具将具有更丰富的正则表达式语言,以下是一些应该可以使用的示例:

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

为了使其与常规 grep 一起工作(不使用 pcre),您必须在正则表达式中放入文字制表符表达式。在许多 shell 中,制表符键执行类似补全的操作,您可以使用Ctrl-v<tab>. 获得文字制表符,因此您可以输入:

grep 'Ctrl-v<tab>-' sample

答案4

检查man 7 regex您可以使用的 POSIX 正则表达式,尽管-PPCRE 在很多地方都受支持,但并不是所有地方都可用(并且手册页说它有缺陷,所以我自己并不总是相信它)POSIX 应该在更多地方起作用。

您可以尝试这样的操作:

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

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

regex(7) 手册页:http://linux.die.net/man/7/regex

可选解决方案

您也可以使用 awk 来执行此操作(当然也可以使用其他工具)。这是一个 awk 示例,它打印第二列小于 0(负数)的行:

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

相关内容