【发布时间】:2011-07-31 15:18:36
【问题描述】:
我需要提取一个字符串,其中只有一位数或两位数。我的文件(测试)看起来像
test1correct
test12something
test123wrong
在上面的例子中,我只想 grep test1correct 和 test12something
我试过这个 grep "test[0-9]{1,2}" test 但它给了我所有 3 行。
【问题讨论】:
我需要提取一个字符串,其中只有一位数或两位数。我的文件(测试)看起来像
test1correct
test12something
test123wrong
在上面的例子中,我只想 grep test1correct 和 test12something
我试过这个 grep "test[0-9]{1,2}" test 但它给了我所有 3 行。
【问题讨论】:
使用: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] 哪个表示,不是数字(当 ^ 在大括号 [ 和 ] 中使用时)。
使用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 风格的正则表达式,它允许您使用前瞻和后瞻。
【讨论】:
试试这个:
test[0-9]{1,2}[A-Za-z]+
【讨论】:
cat tst--- tst 文件包含以下数据 1 0 操作员 4 5 5
猫测试 | grep [0-9]--- 而我使用它的 grrp 只返回 1
1
如何 grep tst 文件中的所有数字?
【讨论】: