当我使用(e)grep搜索文件中的标签时,我会使用垃圾标签(^v + <tab>)。我不能使用\t代替正则表达式中的制表符。与例如sed此表达式效果很好。

所以有可能使用非临时替代来代替<tab>,而不能正常工作/未解释的\t的背景是什么?

评论

stackoverflow.com/questions/1825552/grep-a-tab-in-unix

#1 楼

grep使用的是POSIX定义的正则表达式。出于任何原因,POSIX都没有将\t定义为制表符。

有几种选择:




告诉grep使用由定义的正则表达式perl(perl具有\t作为选项卡):

grep -P "\t" foo.txt


手册页警告这是“实验性”功能。至少\t似乎工作正常。但是可能无法使用更高级的Perl正则表达式功能。


使用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'


/>
有关POSIX和其他系统中定义的字符类的概述,请参见有关正则表达式的维基百科文章。

评论


根据enzotib的回答,让我添加以下内容:grep $'\ t'foo.txt(但我通常会写fgrep而不是grep)

–沃尔特·特罗斯(Walter Tross)
13年2月21日在10:16



我需要这个,并结合使用环境变量的值。我使用了grep“ $(printf'\ t')$ {myvar}” foo.txt。工作正常。经过几次尝试,我无法获得最后一张表格。

– sancho.s ReinstateMonicaCellio
2015年11月23日在22:03



是否有任何原因使普通grep无法将\ t默默地解释为制表符? POSIX是否要求\ t表示其他含义?也许应该只匹配一个文字\后面跟一个t?

–亚伦·麦克戴(Aaron McDaid)
16年1月11日14:23



也许值得注意的是BSD(包括OSX)grep缺少-P选项。

– TextGeek
18年2月8日在18:43



从手册页开始这是高度试验性的,grep -P可能会警告未实现的功能。在旧系统中使用-P可能不是一个好主意。 printf选择更好

– Avindra Goolcharan
18-4-10在18:57



#2 楼

这并不是您想听到的确切答案,但是bash提供了转义序列的可能用法。

command | grep $'\t'


(不要将其放在双引号中!) 。

评论


不需要-E(搜索的内容是没有正则表达式)。也无需通过命令进行管道传输。就是说,谢谢您指出bash的这一被忽略的功能(单引号字符串后加$)

–沃尔特·特罗斯(Walter Tross)
13年2月21日在10:29



确实,我建议@enzotib将答案编辑为grep $'\ t'。

– Teemu Leisti
2013年6月4日12:01



应该强调的是,这是bash的功能,如果被其他shell(例如破折号,这是Ubuntu和其他版本上的shell脚本的默认设置)执行,它将(无声!)做错事。

– xjcl
17年8月26日在14:00

@xjcl我从没听说过破折号是Ubuntu上的默认设置-我的Ubuntu总是有bash。能否请任何来源支持该声明?

–耶拿
20-09-30在11:51

@jena bash是交互式会话的默认设置。但是非交互式脚本默认为/ bin / sh,它是破折号的链接。您可以使用ls -la / bin / sh进行验证

– xjcl
20-09-30在20:22

#3 楼

awk '/\t/'是我最喜欢的解决方法:

printf 'a\t\nb' | awk '/\t/'


输出:a\t

#4 楼

人们总是可以对制表符使用ascii十六进制代码:

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two