如何在不使用文字制表符的情况下对制表符进行 grep,以及为什么 \t 不起作用?

如何在不使用文字制表符的情况下对制表符进行 grep,以及为什么 \t 不起作用?

当我使用 (e)grep 在文件中搜索制表符时,我使用文字制表符 ( ^v + <tab>)。我无法\t在正则表达式中使用它来替代制表符。例如,使用 sed,此表达式效果很好。

那么,是否有可能使用非文字替代,<tab>并且不起作用/未解释的背景是什么\t

答案1

grep 使用正则表达式定义POSIX. 无论出于什么原因,POSIX 都没有定义\t为 tab。

您有多种选择:

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

    grep -P "\t" foo.txt
    

    手册页警告说,这是一个“实验性”功能。至少\t看起来运行良好。但更高级的 perl 正则表达式功能可能不行。

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

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

    grep "^V<tab>" foo.txt
    

    即:输入grep ",然后按ctrl+v,然后按tab,然后输入" foo.txtctrl+v在终端中按下将导致下一个键被逐字执行。这意味着终端将插入一个制表符,而不是触发与制表符键绑定的某些功能。

  • 使用ansi c 引用bash 的特点:

    grep $'\t' foo.txt
    

    这并不适用于所有 shell。

  • 使用 awk:

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

    sed -n '/\t/p'
    

查看维基百科有关正则表达式的文章了解 POSIX 和其他系统中定义的字符类的概述。

答案2

这并不是你想听到的答案,但是 bash 提供了转义序列的可能用途

command | grep $'\t'

(不要将其放入双引号中!)。

答案3

awk '/\t/'是我最喜欢的解决方法:

printf 'a\t\nb' | awk '/\t/'

输出:a\t

答案4

人们总是可以使用制表符的 ascii 十六进制代码:

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two

相关内容