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