Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Bash从文件中提取整个Java语句_Java_Regex_Bash_Grep - Fatal编程技术网

使用Bash从文件中提取整个Java语句

使用Bash从文件中提取整个Java语句,java,regex,bash,grep,Java,Regex,Bash,Grep,我有几个包含大型Java文件的目录,我想取出所有日志消息。这包括log.error、.info等。通常,它们看起来像这样: logger.error("some message here"); 问题在于,其中一些消息包含换行符,因此grep无法接收完整消息: logger.debug("operation [" + j + "] = whatever " + ids[j] + " name: " + names[j] + " time: " + times[j]); 有没有一种方法可以使用

我有几个包含大型Java文件的目录,我想取出所有日志消息。这包括log.error、.info等。通常,它们看起来像这样:

logger.error("some message here");
问题在于,其中一些消息包含换行符,因此grep无法接收完整消息:

logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);
有没有一种方法可以使用正则表达式获取整个Java语句,直到分号

以下是我到目前为止的情况:

grep -rn --include \*.java "\b\.error(\"\b" *
尝试:

作为一个例子,让我们考虑这个测试文件:

$ cat file.java 
some(text);
logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);
other(text);
logger.error("some message here");
more(text); 
让我们提取其记录器语句:

$ find . -iname '*.java' -exec awk '/logger/,/;/' {} +
logger.debug("operation [" + j + "] = whatever " + ids[j] + 
" name: " + names[j] + " time: " + times[j]);
logger.error("some message here");
这是通过查找包含
记录器的行
并打印从那里到包含
的第一行的每一行来实现的

正如亨利在评论中指出的那样,像这样的正则表达式算法不是万无一失的。但是,如果你只是为了目视检查,这应该是一个好的开始

如果还要记录文件名和行号:

$ find . -iname '*.java' -exec awk '/logger/,/;/{printf "%s:%s: %s\n",FILENAME,FNR,$0}' {} +
./file.java:2: logger.debug("operation [" + j + "] = whatever " + ids[j] + 
./file.java:3: " name: " + names[j] + " time: " + times[j]);
./file.java:5: logger.error("some message here");

这是否用于从发布版本中删除日志调用?还是出于其他原因要获取日志行?如果是为了删除日志调用,那么使用像proguard这样的工具,它已经设计好了。总会有不起作用的情况。正则表达式不是用于编程语言解析的合适工具。我将它用于分析目的。我想确保不同模块和不同文件中的所有消息都是一致的。而且我不是regex专业人士,所以我不知道是否有我忽略的解决方案。我想这不会很漂亮的!
$ find . -iname '*.java' -exec awk '/logger/,/;/{printf "%s:%s: %s\n",FILENAME,FNR,$0}' {} +
./file.java:2: logger.debug("operation [" + j + "] = whatever " + ids[j] + 
./file.java:3: " name: " + names[j] + " time: " + times[j]);
./file.java:5: logger.error("some message here");