【问题标题】:Finding a string within a block of code (regexp)在代码块中查找字符串(正则表达式)
【发布时间】: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


【解决方案1】:

你正在与贪婪作斗争。 .* 默认情况下会变得贪婪,所以它会尽可能多地消耗,成为一切。只有在它处理完所有内容后,它才会尝试匹配表达式的下一部分 m 并回溯直到匹配。如果它确实找到了模式的其余部分,它将匹配从 .* ('public \w+([^)]*)' 前面的模式的第一次出现到后面的模式的最后一次出现的所有内容.* (methodName([^~]*~([^)]*))。

解决方法是让.*变得懒惰:.*?,给你完整的表达public \w\+([^)]*).*?methodName([^~]*~([^)]*)

有趣的是,在您使用它的情况下,使用否定字符类的解决方法是首选解决方案,但是,是的,使用 methodName 做类似的事情可能会变得有点笨拙。

见:Laziness Instead of Greediness

【讨论】:

    【解决方案2】:

    尝试使用 sed 代替 grep。以下内容可能会帮助您入门:

    find . -name *.java | xargs awk '{print $0 "~("FILENAME")"}' | \
    sed -n '                                  # start sed with automatic printing suppressed
    /public \w\+/,/^}/H                       # append all constructors to hold space
    $!d                                       # stop here unless this is the last line
    g                                         # copy hold space to pattern space
    s/.*methodName([^~]*~(\([^)]*\)).*/\1/p   # if methodName is called, print the file name
    '
    

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多