如何在Unix平台上的文件中grep标签(\t) ?


当前回答

一个好的选择是使用sed。

sed -n '/\t/p' file

示例(工作在bash, sh, ksh, csh,..):

[~]$ cat testfile
12 3
1 4 abc
xa      c
        a       c\2
1 23

[~]$ sed -n '/\t/p' testfile 
xa      c
        a       c\2
[~]$ sed -n '/\ta\t/p' testfile
        a       c\2

(以下答案已根据评论中的建议进行了编辑。谢谢大家)

其他回答

如果使用GNU grep,你可以使用perl风格的regexp:

grep -P '\t' *

你可能想使用grep "$(echo -e '\t')"

唯一的要求是echo能够解释反斜杠转义。

使用'sed-as-grep'方法,但是用个人偏好的可见字符替换制表符是我最喜欢的方法,因为它清楚地显示了哪些文件包含所请求的信息,以及它在行的位置:

sed -n 's/\t/\*\*\*\*/g' file_name

如果您希望使用行/文件信息,或其他grep选项,但也希望看到制表符的可见替换,您可以通过

grep -[options] -P '\t' file_name | sed 's/\t/\*\*\*\*/g'

举个例子:

$ echo "A\tB\nfoo\tbar" > test
$ grep -inH -P '\t' test | sed 's/\t/\*\*\*\*/g'
test:1:A****B
test:2:foo****bar

编辑:显然,上面的内容只对查看文件内容以定位选项卡有用——如果目标是将选项卡作为更大的脚本会话的一部分来处理,那么这没有任何有用的用途。

在表达式中插入制表符的另一种方法是使用Bash中不太为人所知的$'\t'引号:

grep $'foo\tbar'        # matches eg. 'foo<tab>bar'

(注意,如果你匹配固定字符串,你可以使用-F模式。)

有时使用变量可以使符号更易于阅读和管理:

tab=$'\t'               # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id"     # matches eg. `bob2<tab>323`

我用ksh

grep "[^I]" testfile