根据字符串中的位数过滤列表

Zah*_*ahi 1 bash

我有很长的条目列表记录在一个文件中,类似于这个简短的列表:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
--[SNIP]--
Run Code Online (Sandbox Code Playgroud)

我想根据0123456789每个条目中的位数( set 中的字符)过滤此列表,如果位数超过特定阈值,则保留字符串,否则将其删除。在前面的示例中,如何保留名称中包含 18 位数字的所有条目?

预期输出:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 8

awk

awk -F '[[:digit:]]' 'NF > 18'
Run Code Online (Sandbox Code Playgroud)

我们使用数字作为字段分隔符,因此字段数将是数字数加一(x1y被拆分为xy),因此上面我们正在寻找至少有18 位数字的行。

(使用mawk, 替换[:digit:]0-9.mawk不支持 POSIX 字符类,但它[0-9]与其他awk实现相反,仅在不考虑语言环境的情况下匹配 0123456789。便携,您可以使用[0123456789],或者[0-9]如果您知道文本不包含非- ASCII 数据)。

对于 正好有18 位数字的行,这将是:

awk -F '[[:digit:]]' 'NF == 19'
Run Code Online (Sandbox Code Playgroud)

sed, 表示至少 18 位数字:

sed -e 's/[[:digit:]]/&/18;t' -e d
Run Code Online (Sandbox Code Playgroud)

grep

grep -E '(.*[[:digit:]]){18}'
Run Code Online (Sandbox Code Playgroud)