【问题标题】:Regular Expression for SINGLE digit in grep [duplicate]grep中单个数字的正则表达式[重复]
【发布时间】:2018-06-14 02:48:36
【问题描述】:

我一直在尝试为需要从文件中提取的单个数字获取正则表达式。假设文件有数字:100, 10, 20, 35, 67, 8。我只想要8。 我试过了

    egrep "[0-9]{1}"

但它仍然返回文件中的所有数字。如果我这样做了

    egrep "[0-9]{3}

它只返回 100。为什么它会这样工作?

【问题讨论】:

  • 因为[0-9](1) 将匹配单个数字,而100 是三个单个数字(一、零和零),所有这些都符合正则表达式的规范。 [0-9]{3} 需要连续三个数字,所以它不会匹配 1' (one digit), or 10`(两个数字),但匹配 100(三个数字)。
  • 感谢@KenWhite

标签: regex grep


【解决方案1】:

假设您有以下 2 个输入文件,其编号在同一行或不同行,如下所示:

输入:

more digits*
::::::::::::::
digits2.in
::::::::::::::
100
10
20
35
67
8
::::::::::::::
digits.in
::::::::::::::
100,10,20,35,67,8

您可以运行以下grep 命令来仅获取单个数字(这对两个文件都有效):

$ grep -o '\b[0-9]\b' digits.in                                                                                                  
8
$ grep -o '\b[0-9]\b' digits2.in                                                                                                 
8

说明:

正则表达式 \b[0-9]\b 将匹配由单词边界字符包围的单个数字,-o 选项用于仅打印该结果,而不是像默认行为那样打印整行。

如果有多个数字由一个数字组成:

INPUT2:

more digits*
::::::::::::::
digits2.in
::::::::::::::
100
10
20
35
67
8
9
::::::::::::::
digits.in
::::::::::::::
100,10,20,35,67,8,9

输出:

$ grep -o '\b[0-9]\b' digits2.in 
8
9

$ grep -o '\b[0-9]\b' digits.in                                                                                                  
8
9

这将输出由单个数字组成的所有数字。

【讨论】:

  • 嗯,非常感谢您
【解决方案2】:

如果数字用逗号分隔,试试这个:

    grep ",\d,"

(\d 与 [0-9] 相同)

意思是“匹配一个逗号,后跟一个数字,然后是另一个逗号”。由于我们只需要一位数字,因此我们需要有一个数字的开头和结尾,我们可以用逗号进行分类。

另一种选择是:

    grep "\b\d\b"

这就是说“从单词的开头开始搜索,然后是一个数字,然后是单词的结尾”。一个词被[A-Za-z0-9]分类。如果你想多看\b,它被称为单词边界。

【讨论】:

  • 请注意,grepgrep -E 都不接受 "\d" 的数字;您要么必须将其写为"[0-9]",要么切换到grep -P 正则表达式引擎。
【解决方案3】:

[0-9]{1} 你要求匹配每个数字,因为你实际上没有为你的正则表达式定义边界。如果grep 允许向后看和向前看,您可以使用以下正则表达式

(?<!\d)\d(?!\d)

【讨论】:

    【解决方案4】:
        grep "^[0-9]$"
    

    解决问题。关键是最后缺少的 $。这表明它应该是一个数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多