-2

我有一个包含不同行的文件,其中我有一些行

173.194.034.006.00080-138.096.201.072.49934

模式是 3 个数字,然后是一个点,然后是 3 个数字,然后是一个点,等等。

为此,我想使用 awk、grep 或 sed。我如何表达这个正则表达式?

4

3 回答 3

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

但这真的完全取决于你想用它做什么。

于 2012-10-31T17:58:32.303 回答
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,4,5,6,7,8,9) 范围内出现的一个字符。

因为'.' char 在普通的 grep 正则表达式中具有特殊含义,您可以逃避它,就像\.表示“只需匹配 '。” 字符(仅限!);-)

grep 有一些花哨的扩展,允许您指定一次模式,并包括一个限定符,如{3}or 有时\{3\}(表示 3 次重复)。但是这个扩展不能移植到 Solaris、AIX 等旧的 Unix 上。

这是一个简单的测试,看看您的系统是否支持限定符。(欢迎超级 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。

于 2012-10-31T17:37:12.347 回答
0

从外观上看,这些是 IP 地址,然后是端口号、破折号,然后是 IP 地址/端口号组合。

如果您使用的是现代 UNIX/Linux 系统,那么

grep -P '(\d{3}\.){4}\d{5}-(\d{3}\.){4}\d{5})'

会做的伎俩 - 虽然可能不是最便携的方式来做到这一点。这使用“-P”表示“使用 Perl 正则表达式”选项,有些人可能认为这是作弊!

你没有说在这些字符串之前或之后是否有额外的文本。如果有,那么您可以使用“-o”选项来提取匹配的文本并忽略其他所有内容。

于 2012-10-31T17:59:38.410 回答