grep 制表符和星号字符

grep 制表符和星号字符

如何 grep 查找*文本文件中制表符和星号 ( ) 字符的组合?

例如:

输入:

text    *    0    *    0    *    *    some_text
text    *    9    45   9    0    0    some_text
TEXT    *    0    *    0    0    *    some_text

我需要 grep 查找制表符、星号和零的特定组合,例如:

*    0    *    0    0    *

预期输出:

TEXT    *    0    *    0    0    *    some_text

我可以使用以下命令分别 grep 查找星星:

grep -P '\t' input > output

我可以使用以下命令分别 grep 查找选项卡:

grep '\*' input > output

但我怎样才能将两者结合起来呢?我正在尝试以下组合,但没有成功:

grep -P '\*\t0\t\*0\t0\*' input > output

答案1

便携:

tab=$(printf '\t')
grep -F "*${tab}0${tab}*${tab}0${tab}0"

对于某些 shell(ksh93zshbashmkshFreeBSD sh),您可以使用:

grep -F $'*\t0\t*\t0\t0'

($'\t'也可以写成$'\u0009'或 (在基于 ASCII 的系统上) $'\x09',$'\11'$'\CI')

一些grep实现(例如 ast-open 的实现)将自身识别\t\x09制表符。所以你可以这样做:

grep '\*\t0\t\*\t0\t0'

(与其他正则表达式类型相同(-E对于 ERE、-P对于 perl-like(类似于 PCRE)、-A对于增强)。

GNU grep(至少在 GNU 系统上)不识别\tBRE\x09或 ERE,但识别 PCRE(当内置支持时),(以及\x09\11)。

grep -P '\*\t0\t\*\t0\t0'

grep只要启用了 PCRE 支持(现代系统往往就是这种情况),它就可以与 GNU 一起使用。

另一种便携式解决方案是使用普遍支持的awk替代方案:\t

awk '/\*\t0\t\*\t0\t0/'

答案2

根据ilkkachu评论:

因为 '*\t0\t*0\t0*' 中缺少几个选项卡:中间有一个0,最后是0

命令:

grep -P '\*\t0\t\*\t0\t0'

将解决这个问题。

相关内容