^v + <tab>
)。我不能使用\t
代替正则表达式中的制表符。与例如sed此表达式效果很好。所以有可能使用非临时替代来代替
<tab>
,而不能正常工作/未解释的\t
的背景是什么?#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
评论
stackoverflow.com/questions/1825552/grep-a-tab-in-unix