![grep 和 tabs:无匹配](https://linux22.com/image/573181/grep%20%E5%92%8C%20tabs%EF%BC%9A%E6%97%A0%E5%8C%B9%E9%85%8D.png)
#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 正则表达式,尽管-P
PCRE 在很多地方都受支持,但并不是所有地方都可用(并且手册页说它有缺陷,所以我自己并不总是相信它)POSIX 应该在更多地方起作用。
您可以尝试这样的操作:
grep "^[[:digit:]]\+[[:space:]]\+-"
^
匹配行的开头。
[[:digit:]]\+
匹配一个或多个数字。
[[:space:]]\+
匹配一个或多个空格字符。
-
最后匹配您要查找的负值。
regex(7) 手册页:http://linux.die.net/man/7/regex
可选解决方案:
您也可以使用 awk 来执行此操作(当然也可以使用其他工具)。这是一个 awk 示例,它打印第二列小于 0(负数)的行:
awk '{if ($2 < 0) print}'