【问题标题】:Problem with regular expression using grep使用 grep 的正则表达式问题
【发布时间】:2009-10-06 19:06:04
【问题描述】:

我有一些包含姓名、电话号码和地区代码的文本文件。每行一个组合。

语法始终为“Name Region_code number”
3 个变量之间有任意数量的空格。

我想要做的是搜索特定的区域代码,例如 23 或 493。 问题是这些数字也可能出现在较长的数字中,这可能会导致不应返回的返回。

我在想这种命令:
grep '04' numbers.txt

但如果我这样做了,那么在数字中包含 04 但不是区域代码的行也会显示为结果......这是不正确的。

【问题讨论】:

    标签: regex linux shell grep


    【解决方案1】:

    我确定您即将陷入巧妙的正则表达式中,但我认为在这种情况下您需要做的就是在 grep 中包含区域代码每一侧的一个空格。

    grep ' 04 ' numbers.txt

    【讨论】:

    • 甚至 "grep '04 ' numbers.txt"
    • 谢谢。 头撞到最近的墙上。*
    【解决方案2】:

    我愿意:

    awk '$2 == "04"' < numbers.txt
    

    并使用 grep:

    grep -e '^[^ ]*[ ]*04[ ]*[^ ]*$' numbers.txt
    

    【讨论】:

      【解决方案3】:

      如果您只需要地区代码,您应该使用:

      grep "[[:space:]]04[[:space:]]"
      

      这样它只会在中间一列寻找数字,而字符串的开头或结尾被视为分词。

      你甚至可以这样做:

      function search_region_codes {
         grep "[[:space:]]${1}[[:space:]]" FILE
      }
      

      用你的文件名替换 FILE,

      并使用

      search_region_codes 04
      

      甚至

      function search_region_codes {
         grep "[[:space:]]${1}[[:space:]]" $2
      }
      

      并使用

      search_region_codes NUMBER FILE
      

      【讨论】:

        【解决方案4】:

        您是在搜索整个地区代码,还是在搜索包含子模式的地区代码?

        如果您想要整个区域代码,并且每一侧至少有一个空格,那么您可以通过在特定区域代码的任意一侧添加一个空格来格式化 grep。还有其他方法可以使用正则表达式来指示单词边界。

        grep ' 04 ' numbers.txt
        

        如果姓名或电话号码字段中可以有空格,则该解决方案可能不起作用。此外,如果您的模式可以是区域代码的子部分,那么 awk 是一个更好的工具。这假定“名称”字段不包含空格。匹配运算符 '==' 要求模式与字段完全匹配。当字段的任一侧都有空格时,这可能会很棘手。

        awk '$2 == "04" {print $0}' < numbers.txt
        

        如果文件有分隔符,则可以在 awk 中使用 '-F' 参数设置字段分隔符。在此示例中,逗号用作字段分隔符。此外,此示例中的匹配运算符是“~”,允许模式成为区域代码的任何部分(如果适用)。 “/y”是一种在表达式的开头和结尾匹配工作边界的方法。

        awk -F , '$2 ~ /\y04\y/ {print $0}' < numbers.txt
        

        在这两个示例中,如果您希望打印整行,{print $0} 是可选的。但是,如果您想对输出进行任何格式化,可以在该块内完成。

        【讨论】:

          【解决方案5】:

          使用单词边界。不确定这是否适用于 grep,但在其他正则表达式实现中,我会用空格或单词边界模式包围它

          '\s+04\s+' or '\b04\b'
          

          类似的东西

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-04
            相关资源
            最近更新 更多