我有一些包含姓名,电话号码和地区代码的文本文件。每行一个组合。
语法始终为“Name Region_code number” 在3个变量之间有任意数量的空格。
我想要做的是搜索特定的区域代码,例如23或493。 问题是这些数字也可能出现在更长的数字中,这可能会导致不应该返回的返回。
我在想这种命令:
grep '04' numbers.txt
但是,如果我这样做,那么在数字中包含04但不包含区域代码的行也将显示为结果......这是不正确的。
答案 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'
像这样的东西