簡體   English   中英

Grep / AWK匹配多行

[英]Grep/ AWK match multiple lines

嗨,我有一個Java文件,

public class Test {

 public static void main(String args[]) {
  int x = 10;

 while( x < 5)
 {
 }
  while( x < 20 ) {
   System.out.print("value of x : " + x );
   x++;
   System.out.print("\n");
  }
}
 }

現在,您可以看到有兩個while循環,一個while循環為空,而另一個while循環具有一定的邏輯。

現在,我想打印沒有邏輯的while循環。 換句話說,我想grep並打印沒有任何邏輯的while循環。 我如何grep多行。 這樣我就可以打印沒有邏輯的while循環。

我已經試過了:

gawk '/while\s*\(\S*\)[[:space:]]*{[[:space:]]*/,/}$/' *.java

但這不匹配。

使用在偽代碼中執行以下操作:

# get lines where loop starts
/(for|while)[ \t]*([^)]*)/ {
    # save loop signature
    loops[++i] = $0
    while ($0 !~ /{/)
        getline
    getline
    # store number of open braces
    open=1
}
# when in loop count braces to see when we leave scope
open > 0 {
    if ($0 ~ /{/) 
        open++
    if ($0 ~ /}/)
        open--
    # if line is not a comment or empty, loop not empty
    if ($0 !~ [ \t]*((\/\/|\*).*)?)
        delete loops[i--]
}
END {
    for (j=1; j<i; j++)
        printf loops[j] "\n{\n}\n"
}

請注意,這是偽代碼(讀取未經測試且不完整),以使您了解如何實現目標。 您可以嘗試一下並在遇到麻煩時發表評論。 還要注意,對於嵌套循環,該策略將變得有些困難,但繞過該問題很容易(提示:外部循環包含一個循環,因此在進入內部循環時您可以忘記外部循環,因為它不是空的) 。

暫無
暫無

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

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