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)
这很棘手:哪个关闭括号关闭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)
这是我在评论中概述的括号计数算法的实现.此解决方案也可以进行备份.命令行参数将被解释为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应删除; 但是这些脚本无法这样做.