簡體   English   中英

收到亂碼文本中一些不正確(或沒有)的grep匹配

[英]Receiving some inaccurate (or no) grep matches for numbers in garbled text

我正在進行一個編碼挑戰,要求我的程序(在Cygwin上用bash編寫)來搜索與亂碼文本中有效IPv4地址的不同表示形式匹配的數字。 我已經解決了很多錯誤,但是在處理一些數字時遇到了一個問題。 當我grep指定一個特定的數字時,我收到的結果是一個較大的數字,這是我不想要的。

說我有以下測試文字:
點分十進制89.229.130.225,無前導零。
點分十六進制0xc0.0x0.0x02.0xeb每個八位字節都單獨轉換為十六進制形式。
點分八進制0300.0000.0002.0353每個八位字節分別轉換為八進制。
點分二進制11000000.00000000.00000010.11101011每個八位位組分別轉換為二進制。

10101010101010101010101010101010Binary11000000000000000000001011101011
030135300000Octal030000001353
Hexadecimal0xC00002EB八進制與點分十六進制的連接。
Decimal3221226219以十進制表示的32位數字。
1.1.1.1.1

我正在嘗試搜索第一個數字為零,第二個數字為[1-7],第三到第12個數字為[0-7]的12位數字。 我最初嘗試了這個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)'

沒有一個工作。 什么都沒出來。

我不明白我在做什么錯。 我的正則表達式/推理/文本顯然有問題,但是我不知道這是什么! 任何幫助將不勝感激。

您的最后一個模式看起來不錯,但不要逃避量詞,並且將grep與-Po 選項 -Po

  • -P --perl-regexp將 PATTERN解釋為Perl正則表達式。
  • -o --only-matching僅顯示匹配PATTERN的匹配行的一部分

否定性環視不允許在數字內部進行匹配。

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

請參閱regex101上的pcre演示

我的grep版本反應有點不同。 我必須將您的第一個grep語句重寫為grep -Eo '0[1-7][0-7]{10}' input ,以實現相同的輸出(4行,2不需要)。

您的改進不適用於行首或行尾的數字。 您也可以查找這些字符,但是結果可以是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}$`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM