如何 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(ksh93
、zsh
、bash
、mksh
FreeBSD 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 系统上)不识别\t
BRE\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'
将解决这个问题。