当我使用 (e)grep 在文件中搜索制表符时,我使用文字制表符 ( ^v + <tab>
)。我无法\t
在正则表达式中使用它来替代制表符。例如,使用 sed,此表达式效果很好。
那么,是否有可能使用非文字替代,<tab>
并且不起作用/未解释的背景是什么\t
?
答案1
grep 使用正则表达式定义POSIX. 无论出于什么原因,POSIX 都没有定义\t
为 tab。
您有多种选择:
告诉 grep 使用 perl 定义的正则表达式(perl 有
\t
as 制表符):grep -P "\t" foo.txt
手册页警告说,这是一个“实验性”功能。至少
\t
看起来运行良好。但更高级的 perl 正则表达式功能可能不行。使用 printf 为您打印制表符:
grep "$(printf '\t')" foo.txt
使用文字制表符:
grep "^V<tab>" foo.txt
即:输入
grep "
,然后按ctrl+v
,然后按tab
,然后输入" foo.txt
。ctrl+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