我需要在代码块(当然可以包含换行符)中找到包含字符串的文件的名称,或者更具体地说:构造函数中的某些方法调用(我们称之为methodName)。我需要查看当前目录及其子目录中的所有 java 代码文件。
可能的匹配是:
public myClass() {
a(1);
b();
myMethod("abc");
c(5);
}
这是我到目前为止提出的表达方式:
find . -name *.java | xargs nawk '{print $0 "~("FILENAME")"}' | tr -d "\n" | grep -s -i -o 'public \w\+([^)]*).*methodName([^~]*~([^)]*)'
所以...
- *.java 文件是递归找到的
- 每一行都被打印出来,旁边是它所属的文件名(只是为了跟踪它是在哪里找到
的) - 删除 \n 以便能够使用 grep在一个块中
- 然后查找methodName。
问题是每次我需要使用 .* 时,我都必须将表达式更改为下一个表达式的否定,然后是下一个表达式。例如:如果我需要.*\~
,我需要做([^~]*~
......这不是很好,但我可以忍受它。问题来自methodName,因为否定该字符串会更痛苦。
有任何想法吗?可以用正则表达式完成吗?