如何在不使用文字标签的情况下grep标签,为什么\ t不起作用?


146

当我使用(e)grep搜索文件中的标签时,我会使用垃圾标签(^v + <tab>)。我不能\t代替正则表达式中的制表符。使用例如sed,此表达式效果很好。

那么,是否有可能使用非临时替代品?<tab>不工作/无法解释的背景是什么\t


Answers:


206

grep使用的是POSIX定义的正则表达式。出于任何原因,POSIX都没有定义\t为制表符。

您有几种选择:

  • 告诉grep使用perl定义的正则表达式(perl具有\t制表符):

    grep -P "\t" foo.txt

    手册页警告这是“实验性”功能。至少\t看起来不错。但是可能没有更高级的perl regex功能。

  • 使用printf为您打印一个制表符:

    grep "$(printf '\t')" foo.txt
  • 使用文字制表符:

    grep "^V<tab>" foo.txt

    即:键入grep ",然后按ctrl+v,然后按tab,然后键入" foo.txt。按下ctrl+v终端将使下一个键保持原状。这意味着终端将插入一个制表符,而不是触发绑定到制表键的某些功能。

  • 使用bash 的ansi c引用功能:

    grep $'\t' foo.txt

    这并非在所有shell中都有效。

  • 使用awk:

    awk '/\t/'
  • 使用sed:

    sed -n '/\t/p'

有关POSIX和其他系统中定义的字符类的概述,请参见有关正则表达式维基百科文章


根据enzotib的回答,让我添加以下内容:(grep $'\t' foo.txt但我通常写fgrep而不是grep
Walter Tross

我需要这个,并结合使用环境变量的值。我用过grep "$(printf '\t')${myvar}" foo.txt。工作正常。经过几次尝试,我无法获得最后一张表格。
sancho.s 2015年

1
有什么理由grep无法将平原无声地解释\t为制表符吗?POSIX是否要求\t其他内容?也许应该只匹配\ 后跟一个字母的文字t
亚伦·麦克戴德

也许值得注意的是BSD(包括OSX)grep缺少-P选项。
TextGeek

来自手册页This is highly experimental and grep -P may warn of unimplemented features.可能不是-P在旧系统中使用的好主意。该printf选择更好
Avindra Goolcharan

13

这并不是您想听到的确切答案,但是bash提供了转义序列的可能用法

command | grep $'\t'

(请勿将其用双引号引起来!)。


1
不需要-E(搜索的内容是没有正则表达式)。也无需通过命令进行管道传输。就是说,谢谢您指出bash的这一被忽略的功能(单引号字符串后加$)
Walter Tross

2
确实,我建议@enzotib将答案编辑为simple grep $'\t'
Teemu Leisti

应该强调的是,这是bash的功能,如果被其他Shell执行(例如破折号,这是Ubuntu和其他
操作系统


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.