使用grep进行正则表达式的问题

时间:2009-10-06 19:06:04

标签: regex linux shell grep

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

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

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

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

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

5 个答案:

答案 0 :(得分:6)

我确定你会被隐藏在聪明的正则表达式中,但我认为在这种情况下,您需要做的就是在grep中包含区域代码每一侧的一个空格。

grep ' 04 ' numbers.txt

答案 1 :(得分:2)

我会这样做:

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

并使用grep:

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

答案 2 :(得分:1)

如果您只想要区域代码,则应使用:

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

答案 3 :(得分:0)

您是在搜索整个区域代码还是包含子图案的区域代码?

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

grep ' 04 ' numbers.txt

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

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

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

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

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

答案 4 :(得分:-1)

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

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

像这样的东西