我有一个不同行的文件,其中有一些像
这样的行173.194.034.006.00080-138.096.201.072.49934
模式是3个数字,然后是一个点,然后是3个数字,然后是一个点等
我想为此目的使用awk,grep或sed。我该如何表达这个正则表达式?
答案 0 :(得分:1)
假设你想要获得像123这样的1系列的行。存在,
grep '[0-9][0-9][0-9]\.' file > numbersFile
如果您想要像123.345那样的2个系列,那么请执行
grep '[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.' file > numbersFile
等等。
每个[0-9]
表示只匹配0-9(0,1,2,3,5,5,7,8,9)范围内的一个字符出现。
因为'。' char在普通的grep regexp中有一个特殊的含义,你可以像\.
一样逃避它,以表示“只匹配'。' char(仅限!); - )
grep有花哨的扩展,允许您指定模式一次,并包含{3}
或有时\{3\}
等限定符(表示3次重复)。但是这个扩展不能移植到旧的Unix,如Solaris,AIX等。
这是一个简单的测试,看看你的系统是否支持限定符。 (欢迎Super Grep-heads更正我的术语: - )。
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{10\}\.'
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{2\}\.'
第一个测试应该失败,如果你的grep支持限定符,第二个测试将成功。
学习长手解决方案(如上所述)并没有什么坏处,你可以确定这适用于任何grep。
IHTH。
答案 1 :(得分:1)
在awk中,我可能会构建字符串,然后将其搜索为:
BEGIN {
p = "[.]"
d = "[[:digit:]]"
d3 = d d d # or d"{3}"
d5 = d d d d d # or d"{5}"
re = d3 p d3 p d3 p d3 p d5 # or "(" d3 p "){4}" d5
}
$0 ~ re "-" re
但这完全取决于你想用它做什么。
答案 2 :(得分:0)
通过它看,这些是IP地址,然后是端口号,破折号,然后是IP地址/端口号组合。
如果您使用的是现代UNIX / Linux系统,那么
grep -P '(\d{3}\.){4}\d{5}-(\d{3}\.){4}\d{5})'
会做到这一点 - 虽然可能不是最便携的方式。这使用'-P'表示“使用Perl正则表达式”选项,有些人可能认为这是作弊!
您没有说明在这些字符串之前或之后是否有额外的文字。如果你有,那么你可以使用'-o'选项来提取匹配的文本并忽略其他所有内容。