问题描述
当我使用(e)grep搜索文件中的选项卡时,使用litteral选项卡(^v + <tab>
)。我无法使用\t
替代正则表达式中的选项卡。例如, sed这个表达效果很好。
那么是否有可能为<tab>
使用non-litteral替代品,以及非工作/未解释的\t
的背景是什么?
最佳解决办法
grep使用POSIX定义的正则表达式。由于POSIX没有将\t
定义为选项卡的原因。
你有几个选择:
-
告诉grep使用perl定义的正则表达式(perl有
\t
作为标签):grep -P "\t" foo.txt
-
使用printf为您打印制表符:
grep "$(printf '\t')" foo.txt
-
或者,正如您已经提到的那样,使用字面标签字符:
grep "^V<tab>" foo.txt
即:键入
grep "
,然后按ctrl+v
,然后按tab
,然后键入" foo.txt
。在shell中按ctrl+v
会导致按字面输入下一个键。这意味着shell将插入一个制表符而不是触发某个绑定到Tab键的函数。 -
如果你使用bash,你可以使用ansi c quoting功能:
grep $'\t' foo.txt
请参阅wikipedia article about regular expressions以了解POSIX和其他系统中定义的字符类的概述。
次佳解决办法
这不完全是您想要听到的答案,但可能使用的转义序列由bash提供
command | grep $'\t'
(不要把它放进双引号!)。