我有一个带有不同行的文件,其中我有一些行,例如
173.194.034.006.00080-138.096.201.072.49934
模式为3个数字,然后是一个点,然后是3个数字,然后是一个点等等。
我想为此目的使用尴尬,grep或sed。我如何表达此正则表达式?
假设您想获得1个系列的行,例如123。存在,做
grep '[0-9][0-9][0-9].' file > numbersFile
如果您想要2个系列,例如123.345。
grep '[0-9][0-9][0-9].[0-9][0-9][0-9].' file > numbersFile
等,等等
每个[0-9]
意味着仅匹配0-9之间的字符发生(0,1,2,3,4,5,6,7,8,9)。
因为'。'。char在普通的GREP REGEXP中具有特殊的含义,您将像.
一样逃脱它,以指示"只需匹配''。char(仅!); - )
GREP有一些花哨的扩展,使您可以一次指定该模式,并包括{3}
或有时{3}
(指示3个重复)等预选赛。但是,此扩展名无法移植到Solaris,AIX和其他等较旧的Unix。
这是一个简单的测试,看看您的系统是否支持限定符。(欢迎超级格雷普头纠正我的术语: - )。
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。
在尴尬中,我可能会构建字符串,然后搜索为:
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
,但这实际上取决于您想处理什么。
从外观上看,这些是IP地址,其次是端口号,破折号,然后是IP地址/端口号码组合。
如果您在现代Unix/Linux系统上,则
grep -P '(d{3}.){4}d{5}-(d{3}.){4}d{5})'
可以解决问题 - 尽管可能不是最便携的方法。这使用" -p"作为"使用perl正则表达式"选项,有些人可能会认为这是作弊!
您没有说在这些字符串上的这些字符串之前或之后是否有额外的文字。如果有