[英]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
但這不匹配。
使用awk在偽代碼中執行以下操作:
# 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.