Answers:
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'grep $'\t' foo.txt但我通常写fgrep而不是grep)
grep "$(printf '\t')${myvar}" foo.txt。工作正常。经过几次尝试,我无法获得最后一张表格。
grep无法将平原无声地解释\t为制表符吗?POSIX是否要求\t其他内容?也许应该只匹配\ 后跟一个字母的文字t?
This is highly experimental and grep -P may warn of unimplemented features.可能不是-P在旧系统中使用的好主意。该printf选择更好
这并不是您想听到的确切答案,但是bash提供了转义序列的可能用法
command | grep $'\t'
(请勿将其用双引号引起来!)。
grep $'\t'。
awk '/\t/' 是我最喜欢的解决方法:
printf 'a\t\nb' | awk '/\t/'
输出:a\t。
人们总是可以对选项卡使用ascii十六进制代码:
$ echo "one"$'\t'"two" > input.txt
$ grep -P "\x9" input.txt
one two
$ grep $'\x9' input.txt
one two