-1

我必须使用 grep 在一个包含 300 000 行代码的文件中搜索几个结构。

第一个问题

我需要找到类似下面第一个代码的代码,我正在寻找交替的 + - 结构,其他字符被视为分隔符,+-+ 或 -+- 也是正确的。我们在 ] 之后开始搜索,如下例所示

++[>++>+++>+<<<-]>++++++++.---.+.>.<------.+.>.>. ∈ γ, (correct, it is alternating)

++[>++>+++>+<<<-]>+++++.>++++++.>++.++++.-----.>. not ∈ γ (so incorrect +* is followed by +*)

第二个问题

我需要找到像下面的第一个代码这样的代码,我正在寻找奇数的出现次数 - 在连续的一对 <> 和一个空的 <> 之间被视为偶数,所以不正确。

++[>++>+++>+<<<-]>+.>++++++++.<-.----.+++++++.>>. ∈ δ (correct, odd times - between <> )

++[>++>+++>+<<<-]>+++.>++++++.<<-.-.>>--.<---.>>. not ∈ δ (incorrect, even times - between <> )

请注意,只允许使用 grep,我们可能不会使用我首先使用的文本编辑器。

4

2 回答 2

0

我懂了:

sed 's/.*]//' file | tr -d "><" | tr -s "+-" | tr -d "." | egrep "\+\+|\-\-"

这样做:

  1. 在第一个右方括号之前忽略所有内容

  2. 删除所有><因为你的描述没有任何意义

  3. 挤压所有+-单次出现

  4. 删除所有点

  5. 寻找其中一个++--剩下的

于 2015-01-03T17:19:59.807 回答
0

对于这两个正则表达式,如果可用,请使用 egrep 和 Perl 选项。如果您期望单行
,您可能可以从类中删除。\r\n

问题一:

 #  \][^-+\]\r\n]*(?:[-]+[^-+\]\r\n]*)?[+]+[^-+\]\r\n]*[-]+(?:[^-+\r\n]*[+]+[^-+\]\r\n]*[-]*)*[^-+\]\r\n]*$

 \]                                 # ]

 [^-+\]\r\n]*                       # Not - + ] or newline

 (?: [-]+  [^-+\]\r\n]* )?          # Optional - .

 [+]+ [^-+\]\r\n]* [-]+             # Required + . -

 (?:
      [^-+\r\n]* 
      [+]+ [^-+\]\r\n]* [-]*        # Optional +
 )*

 [^-+\]\r\n]*                       # Not - + ] or newline
 $

问题2:

 # ^(?![^\r\n]*<(?:[^-<>\r\n]*[-][^-<>\r\n]*[-])*[^-<>\r\n]*>)[^\r\n]*<[^-<>\r\n]*[-](?:[^-<>\r\n]*[-][^-<>\r\n]*[-])*[^-<>\r\n]*>

 ^ 
 (?!               # Not an even sequence
      [^\r\n]* 
      <      
      (?:
           [^-<>\r\n]* 
           [-] 
           [^-<>\r\n]* 
           [-] 
      )*
      [^-<>\r\n]* 
      >
 )

 [^\r\n]*     

 <                 # First odd sequence
 [^-<>\r\n]* 
 [-] 
 (?:
      [^-<>\r\n]* 
      [-] 
      [^-<>\r\n]* 
      [-] 
 )*
 [^-<>\r\n]* 
 >
于 2015-01-03T18:02:28.063 回答