正则表达式和 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 word
为test
即^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 仅匹配只有一位数或两位数的字符串的主要内容,如果未能解决你的问题,请参考以下文章