unw*_*ind 362
如果使用GNU grep,您可以使用Perl样式的正则表达式:
grep -P '\t' *
Run Code Online (Sandbox Code Playgroud)
ant*_*rov 301
诀窍是在单引号前使用$ sign .它也适用于切割和其他工具.
grep $'\t' sample.txt
Run Code Online (Sandbox Code Playgroud)
Sam*_*amK 83
我从来没有设法让'\ t'元字符与grep一起工作.但是我发现了两种替代解决方案
<Ctrl-V> <TAB>(按Ctrl-V然后键入tab)foo | awk '/\t/'Poo*_*Poo 43
从Ask Ubuntu上的这个答案:
告诉grep使用Perl定义的正则表达式(Perl有
\tas选项卡):Run Code Online (Sandbox Code Playgroud)grep -P "\t" <file name>使用文字制表符:
Run Code Online (Sandbox Code Playgroud)grep "^V<tab>" <filename>使用
printf打印制表符给你:Run Code Online (Sandbox Code Playgroud)grep "$(printf '\t')" <filename>
tjm*_*ore 30
一种方法是(这是与Bash)
grep -P '\t'
Run Code Online (Sandbox Code Playgroud)
-P 打开Perl正则表达式,因此\ t将起作用.
正如用户放松所说,它可能是特定于GNU grep.如果shell,编辑器或终端允许,可以选择在其中插入一个选项卡.
Alo*_*dal 11
在表达式中字面插入选项卡的另一种方法是使用$'\t'Bash中鲜为人知的引用:
grep $'foo\tbar' # matches eg. 'foo<tab>bar'
Run Code Online (Sandbox Code Playgroud)
(请注意,如果您匹配固定字符串,则可以使用'-F'模式.)
有时使用变量可以使符号更具可读性和可管理性:
tab=$'\t' # `tab=$(printf '\t')` in POSIX
id='[[:digit:]]\+'
name='[[:alpha:]_][[:alnum:]_-]*'
grep "$name$tab$id" # matches eg. `bob2<tab>323`
Run Code Online (Sandbox Code Playgroud)
小智 10
这不是您正在寻找的,但可能适用于您的情况
grep '[[:blank:]]'
Run Code Online (Sandbox Code Playgroud)
相当于
grep -P '[ \t]'
Run Code Online (Sandbox Code Playgroud)
所以它会找到Space和Tab.
请注意,它不是在我的广告man grep,但仍然有效
$ man grep | grep blank | wc
0 0 0
小智 6
基本上有两种解决方法:
(推荐)使用grep(1)支持的正则表达式语法.现代grep(1)支持两种形式的POSIX 1003.2正则表达式语法:基本(过时)RE和现代 RE.语法在re_format(7)和regex(7)手册页中有详细描述,它们分别是BSD和Linux系统的一部分.GNU grep(1)还支持pcre(3)库提供的Perl兼容RE.
在正则表达式语言中,制表符号通常由\tatom 编码.的原子被BSD扩展正则表达式的支持(egrep,grep -E在BSD兼容系统),以及Perl兼容的RE(pcregrep,GNU grep -P).
基本正则表达式和Linux扩展RE显然都不支持\t.请参考UNIX实用程序手册页以了解它支持哪种正则表达式语言(因此sed(1),awk(1)和pcregrep(1)正则表达式之间的区别).
因此,在Linux上:
$ grep -P '\t' FILE ...
Run Code Online (Sandbox Code Playgroud)
在BSD一样的系统:
$ egrep '\t' FILE ...
$ grep -E '\t' FILE ...
Run Code Online (Sandbox Code Playgroud)将制表符转换为模式.编辑脚本文件时这很简单:
# no tabs for Python please!
grep -q ' ' *.py && exit 1
Run Code Online (Sandbox Code Playgroud)
但是,在交互式shell中工作时,您可能需要依赖shell和终端功能在行中键入正确的符号.在大多数终端上,这可以通过Ctrl+ V组合来完成,它指示终端按字面意思处理下一个输入字符(V用于"逐字"):
$ grep '<Ctrl>+<V><TAB>' FILE ...
Run Code Online (Sandbox Code Playgroud)
某些shell可能为命令排版提供高级支持.这样,在bash(1)中,表格的字$'string'是特别对待的:
bash$ grep $'\t' FILE ...
Run Code Online (Sandbox Code Playgroud)
请注意,虽然在命令行中很好,但是当脚本移动到另一个平台时,这可能会产生兼容性问题.另外,使用特价时请注意引号,详情请咨询bash(1).
对于Bourne shell(并且不仅仅是),可以使用printf(1)增强的命令替换来模拟相同的行为,以构造正确的正则表达式:
$ grep "`printf '\t'`" FILE ...
Run Code Online (Sandbox Code Playgroud)小智 5
A good choice is to use sed.
sed -n '/\t/p' file
Run Code Online (Sandbox Code Playgroud)
Examples (works in bash, sh, ksh, csh,..):
[~]$ cat testfile
12 3
1 4 abc
xa c
a c\2
1 23
Run Code Online (Sandbox Code Playgroud)
[~]$ sed -n '/\t/p' testfile
xa c
a c\2
[~]$ sed -n '/\ta\t/p' testfile
a c\2
Run Code Online (Sandbox Code Playgroud)
(This answer has been edited following suggestions in comments. Thank you all)