簡體   English   中英

AWK Regex查找特定模式

[英]AWK Regex to find specific patterns

我在一個項目中有許多Java文件,並且有幾個循環是空的,並且有一些循環是有邏輯的。 我需要找到沒有任何邏輯的循環。

例如:將該文件命名為Test.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");
 }
 }
}

現在將有許多其他這樣的Java文件,其中將使用while循環。 我需要找到沒有任何邏輯的while循環的所有文件。 因此,我需要編寫一個模式,在其中可以找到所有while循環的出現,在{}括號之間沒有任何邏輯或任何內容。

如果我們使用該文件(Test.java),則輸出應為:

   while (x <5)
   {

   }

文件名和行號。 由於將要引用很多文件,因此我需要文件名和發生這種情況的行號。

希望我清楚我的問題。

請幫忙。

正如您剛剛發現的那樣,切勿使用范圍表達式,因為它們會使瑣碎的任務變得簡短一些,但需要完全重寫或重復的條件才能使需求發生最細微的變化。 始終設置/測試標志。

如果沒有用於語言的解析器,就無法穩健地完成此工作,例如,如果在填充的while循環內有注釋或字符串或if { ... }或其他甚至有點有趣的事情,您將怎么辦?

您也沒有提供任何實際的示例輸入/輸出來測試解決方案,也沒有告訴我們您要查找的內容時要打印的內容嗎? 去掉它? 還有什么嗎

綜上所述,這個便宜而開朗的“解決方案”可能足以滿足您的需求:

awk '
inWhile && /}/ { 
    if (!gotStuff) {
        print "Empty loop ended at line", NR
    }
    inWhile=0
}
inWhile && NF { gotStuff=1 }
/while\s*\([^)]*\)\s*{/ { inWhile=1; gotStuff=0 }
' file

上面\\s[[:space:]]使用\\s簡寫,如果awk不支持,則不要使用該簡寫(GNU awk支持)。

如果以上條件還不夠,請編輯您的問題以提供一些具體的,可測試的樣本輸入和預期輸出。

暫無
暫無

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

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