仅从For Loops块中删除System.out语句

Deb*_*Das 3 python java regex perl code-editor

任何方法只能轻松地文件中的for循环块中删除它们...

之前:

for( ... ) {
...
System.out.println("string");
...
System.out.println("string");
...
}
Run Code Online (Sandbox Code Playgroud)

之后:

for( ... ) {
...
... 
...
}
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 6

这很棘手:哪个关闭括号关闭for-loop?要么解析整个代码,要么使用一些启发式.在下面的解决方案中,我要求右括号的意图与for关键字的意图相同:

$ perl -nE'
    if( /^(\s*)for\b/ .. /^$ws\}/ ) {
      $ws = $1 // $ws;
      /^\s*System\.out\.println/ or print;
    } else { print }'
Run Code Online (Sandbox Code Playgroud)

这使用触发器操作符COND1 .. COND2.该脚本可用作简单的过滤器

$ perl -nE'...' <source >processed
Run Code Online (Sandbox Code Playgroud)

或备份功能:

$ perl -i.bak -nE'...' source
Run Code Online (Sandbox Code Playgroud)

(创建文件source.bak作为备份).

仅针对示例输入进行测试; 不是一个明智的测试套件.
该脚本通过了GLES Prateek Nina测试.

要在目录中的所有Java文件上运行此脚本,请执行此操作

$ perl -i.bak -nE'...' *.java
Run Code Online (Sandbox Code Playgroud)

编辑

在Windows系统上,必须将分隔符更改为".此外,我们必须自己做所有的游戏.

> perl -nE"if(/^(\s*)for\b/../^$ws\}/){$ws=$1//$ws;/^\s*System\.out\.println/ or print}else{print}BEGIN{@ARGV=$#ARGV?@ARGV:glob$ARGV[0]}" *.java
Run Code Online (Sandbox Code Playgroud)

编辑2

这是我在评论中概述的括号计数算法的实现.此解决方案也可以进行备份.命令行参数将被解释为glob表达式.

#!/usr/bin/perl
use strict; use warnings;

clean($_) for map glob($_), @ARGV;

sub clean {
    local @ARGV = @_;
    local $^I = ".bak";
    my $depth = 0;
    while (<>) {
        $depth ||= /^\s*for\b/ ? "0 but true" : 0;
        my $delta = ( ()= /\{/g ) - ( ()= /\}/g );
        $depth += $delta if $depth && $delta;
        $depth = 0 if $depth < 0;
        print unless $depth && /^\s*System\.out\.println/;
    }
    return !!1;
}
Run Code Online (Sandbox Code Playgroud)

这也不做评论.这只会重新System.out.println识别开始新行的语句.

用法示例:> perl thisScript.pl *.java.

这是一个带有伪java语法的测试文件,我用它进行测试.XXX一旦脚本运行,标记为的所有行都将消失.

/** Java test suite **/

bare block {
    System.out.println(...); // 1 -- let stand
}

if (true) {
    for (foo in bar) {
        System.out.println; // 2 XXX
        if (x == y) {
            // plz kill this
            System.out.println // 3 XXX
        } // don't exit here
        System.out.println // 4 XXX
    }
}

for (...) {
    for {
        // will this be removed?
        System.out.println // 5 XXX
    }
}

/* pathological cases */

// intendation
for (...) { System.out.println()/* 6 */} 

// intendation 2
for (...)
{
    if (x)
    {
        System.out.println // 7 XXX
    }}

// inline weirdness
for (...) {
    // "confuse" script here
    foo = new baz() {void qux () {...}
    };
    System.out.println // 8 XXX
}
Run Code Online (Sandbox Code Playgroud)

№1应该留下来,并且确实如此.声明№6应删除; 但是这些脚本无法这样做.