Grep / AWK匹配多行

时间:2015-06-18 13:42:46

标签: regex grep gawk

您好我有一个java文件,

- (UIImage*) addLayerTo:(UIImage*)source
{
    CGSize size = [source size];
    // create context with UIScrean scale
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    // get new context
    CGContextRef ctx1 = UIGraphicsGetCurrentContext();
    // draw view
    CGContextDrawImage(ctx1, CGRectMake(0.0f, 0.0f, size.width, size.height), source.CGImage);
    // set fill color
    UIColor *fillColor = [UIColor purpleColor];
    // fill with it
    CGContextSetFillColorWithColor(ctx1, fillColor.CGColor);
    CGContextFillRect(ctx1, CGRectMake(0, 0, size.width, size.height));

    // create new image
    UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
    // end context
    UIGraphicsEndImageContext();

    return outputImage;
}

现在你可以看到有两个while循环,一个while循环是空的,而另一个while循环有一些逻辑。

现在我想打印没有逻辑的while循环。换句话说,我想grep并打印没有任何逻辑的while循环。我怎么能grep多行。这样我就可以打印没有逻辑的while循环。

我试过这个:

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");
  }
}
 }

但它不匹配。

1 个答案:

答案 0 :(得分:1)

使用在伪代码中执行类似的操作:

# 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"
}

请注意,这是伪代码(读取未经测试且不完整),以便您了解如何实现目标。遇到麻烦时,你可以尝试一下并发表评论。还要注意,对于嵌套循环,策略会变得有点困难但是很容易绕过这个问题(提示:外部循环包含一个循环,因此当运行到内部循环时你可以忘记外部循环,因为它不是空的)