【发布时间】:2012-07-06 20:59:44
【问题描述】:
我需要在代码块(当然可以包含换行符)中找到包含字符串的文件的名称,或者更具体地说:构造函数中的某些方法调用(我们称之为 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 会出现问题,因为否定该字符串会更痛苦。
有什么想法吗?可以用正则表达式完成吗?
【问题讨论】:
-
我是不是真的很蠢,或者看起来
tr -d "\n"基本上会在一行中打印所有内容? -
@ArjunShankar 我想这就是他想要做的。因为“public ... methodname..”可能在原始文件中包含换行符。但是,我真的不明白 OP 会搜索什么。 OP:你能不能让它更简单,例如我想在所有 java 文件中搜索“某物”。你能定义“某事”吗?
-
如果您搜索
.*methodName,那么 grep 将不会通过匹配.*来吃掉methodName。 Grep 喜欢找到匹配项,它会的。
标签: regex linux string grep newline