[英]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.