正则表达式和 grep 仅匹配只有一位数或两位数的字符串

Posted

技术标签:

【中文标题】正则表达式和 grep 仅匹配只有一位数或两位数的字符串【英文标题】:regex and grep match only string with only single or double digit 【发布时间】:2011-07-31 15:18:36 【问题描述】:

我需要提取一个字符串,其中只有一位数或两位数。我的文件(测试)看起来像

test1correct
test12something
test123wrong

在上面的例子中,我只想 grep test1correct 和 test12something

我试过这个 grep "test[0-9]1,2" test 但它给了我所有 3 行。

【问题讨论】:

【参考方案1】:

使用:grep "test[0-9]1,2[^0-9]"

【讨论】:

谁能解释一下这个正则表达式? 解释:grep "^test[0-9]\1,2\[^0-9]" test.txt 可以在任何地方使用。基本上,您试图仅获取行的starting wordtest^test 的那些行(请参阅^ 字符,这意味着给定行的起点/字符),然后搜索数字@987654327 @(介于 0 到 9 之间, 之前的反斜杠是必需的)然后为避免使用 3 位数字,1 或 2 位数字之后的下一个字符可以是数字以外的任何字符,因此 [^0-9] 哪个表示,不是数字(当 ^ 在大括号 [] 中使用时)。【参考方案2】:

使用lookaheads 和lookbehinds,您可以指定“正好一位”或“正好三位”或其他。这恰好是一位数:

echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]1)(?![[:digit:]])'
Result: 4

它的作用是,找到一个前面没有数字,后面也没有数字的数字。也适用于超过一位数。这是三位数字,然后是其他任何数字中的至少一位,然后是一位:

echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]3)(?![[:digit:]]).+(?<![[:digit:]])([[:digit:]]1)(?![[:digit:]])'
Result: 123_4

当我这样做时,grep 和 sed 的这种组合将找到一个包含三个数字的字符串,然后是一个或多个其他数字,然后是一个数字,并很好地提取这些部分。 (在 grep 中可能还有另一种方法可以做到这一点。)

echo 'WB123_4' | grep -Po '(?<![[:digit:]])([[:digit:]]3)(?![[:digit:]]).+(?<![[:digit:]])([[:digit:]]1)(?![[:digit:]])' | sed -r -e 's/[^[:digit:]]+/ /'
Result: 123 4

注意:grep 的 -P 标志意味着使用 Perl 风格的正则表达式,它允许您使用前瞻和后瞻。

【讨论】:

【参考方案3】:

试试这个:

test[0-9]1,2[A-Za-z]+

【讨论】:

【参考方案4】:

cat tst--- tst 文件包含以下数据 1 0 操作员 4 5 5

猫测试 | grep [0-9]--- 而我使用它的 grrp 只返回 1

1

如何 grep tst 文件中的所有数字?

【讨论】:

这并没有提供问题的答案。您可以search 询问类似问题,或参考页面右侧的相关和链接问题以找到答案。如果您有一个相关但不同的问题,ask 一个新问题,并包含指向此问题的链接以帮助提供上下文。请参阅:Ask questions, get answers, no distractions。

以上是关于正则表达式和 grep 仅匹配只有一位数或两位数的字符串的主要内容,如果未能解决你的问题,请参考以下文章

awk中如何用正则表达式判断某位数值的位数?

Linux正则表达式教程:Grep Regex示例

Linux正则表达式与通配符

grep正则表达式

求只能输入 正数和两位小数 的正则表达式,要能用的。。。

grep零宽断言&正则表达式