接收到一些不准确(或没有)的grep匹配的乱码文本中的数字



我正在处理一个编码挑战,该挑战要求我的程序(在Cygwin上的bash中编写)在乱码文本中搜索与有效IPv4地址的不同表示形式匹配的数字。我已经解决了很多错误,但在处理一些数字时遇到了一个问题。当我输入一个特定的数字时,我收到的结果在一个较大的数字内,这是我不想要的。

假设我有以下测试文本:
带点小数89.229.130.225,不带前导零
带点的十六进制0xc0.0x0.0x02.0xeb每个八位字节单独转换为十六进制形式。
点八进制300.0000.0000.0353每个八进制都单独转换为八进制
带点二进制1100000.000000.000000010.11101011每个八位字节都被单独转换为二进制

10101010101010101010二进制1100000000000000001011101011
0301353000000八佰300000033
十六进制0xC00002EBC从带点的十六进制开始的八位字节的计数
Decimal3221226219以十进制表示的32位数字
1.1.1.1.1

我试图搜索一个12位数字,其第一位为零,第二位为[1-7],第三位至第十二位为[0-7]。我最初尝试过这个grep:

grep -o '0[1-7][0-7]{10}'

但它返回了:
010101010101<-不需要的
010101010101<-不需要的
030135300000<-所需输出
030000001353<-所需输出

因为我不想使用另一个数字中的数字,所以我试图获得在之前或之后除了数字之外的任何匹配:

grep -o '[^0-9]0[1-7][0-7]{10}[^0-9]'

但这没有任何回报!

我也尝试过其他相关帖子中的以下内容:

grep -Eo '(^|[^0-9])0[1-7][0-7]{10}($|[^0-9])'
grep -o '[^0-9]?0[1-7][0-7]{10}[^0-9]?'
grep -P '(?<!d)0[1-7][0-7]{10}(?!d)'

没有一个奏效。什么也没说出来。

我不明白我做错了什么。很明显,我的regex/reasoning/text出了问题,但我不知道是什么!如有任何帮助,我们将不胜感激。

您的最后一个模式看起来不错,但不要跳过量词,而是使用带有选项-Po 的grep

  • -P--perl正则表达式/emsp;将PATTERN解释为Perl正则表达式
  • -o——仅匹配/emsp;仅显示匹配行中与PATTERN匹配的部分

负数查找不允许数字内部匹配。

grep -Po '(?<!d)0[1-7][0-7]{10}(?!d)'

请参阅regex101 上的pcre演示

我的grep版本的响应有点不同。对于相同的输出(4行,2行不需要的),我不得不将您的第一个grep语句重写为grep -Eo '0[1-7][0-7]{10}' input

你的改进在开始或结束时都不适用于数字。你也可以寻找这些,但你的结果可能是12、13或14个字符长。你需要再次对结果进行grep:

grep -Eo '([^0-9]|^)0[1-7][0-7]{10}([^0-9]|$)' input |
   grep -Eo '0[1-7][0-7]{10}'

当你对第二个grep满意时,你可以改变方法
首先查找数字并检查结果:

grep -Eo "[0-7]{12}" input | grep -E "^0[1-7][0-7]{10}$"

用你的grep,这可能看起来像

grep -o '[0-7]{12}' input | grep '^0[1-7][0-7]{10}$`

最新更新