我正在 bash 中使用 grep /egrep 查找两个引号之间的所有制表符。
我试过
grep -r . -e "\".*\t.*\""
grep -r . -e "\".*\\t.*\""
grep -r . -e "\".*\\\\t.*\""
grep -r . -e '\".*\t.*\"'
grep -r . -e '\".*\\t.*\"'
grep -r . -e '".*\t.*"'
grep -r . -e '".*\\t.*"'
但我没有得到想要的结果。以下grep
s 产生所有带有 a 的行\t
:
grep -r . -e "\".*\\\\t.*\""
grep -r . -e '\".*\\t.*\"'
grep -r . -e '".*\\t.*"'
以下grep
s 产生所有带有 a 的行t
:
grep -r . -e "\".*\t.*\""
grep -r . -e "\".*\\t.*\""
grep -r . -e '".*\t.*"'
grep -r . -e '\".*\t.*\"'
但这些都没有寻找真正的制表机。我做错了什么?
答案1
GNU grep
(我假设您正在使用它)默认情况下不知道\t
作为选项卡。在 POSIX 正则表达式中,\t
会匹配文字t
, 并\\t
会匹配\t
。
要将文本制表符与 POSIX 正则表达式匹配,请在表达式中插入一个制表符:
grep -r $'".*\t.*"' .
这用于$'...'
将bash
字符串中的转义序列扩展为它们在 C 语言中的相应含义。
-P
如果您在 GNU 中启用类似 Perl 的正则表达式 (PCRE) grep
,它将识别\t
为表达式中的制表符:
grep -P -r '".*\t.*"' .
另请注意,您的表达式将匹配
"hello" <tab> "world"