【问题标题】:Grep files with uncommented "console.log" string带有未注释“console.log”字符串的 Grep 文件
【发布时间】:2012-10-23 18:29:10
【问题描述】:

我需要返回目录中包含字符串console.log 的所有文件,但未注释。所以我想我应该搜索在换行符和console.log 字符串之间没有字符串// 的任何行。

此命令返回已注释和未注释的 console.log。我想排除注释了 console.log 的实例。

grep -H -r  "^.*[^//].*console\.log" /var/www/vhosts/mysite.com

我需要的命令将匹配这些行:

var num = 0;  console.log(num);
alert('some text'); console.log('anything');
  console.log();

但不匹配这些行:

var num = 0; // console.log(num);
//alert('some text'); console.log('anything');
  // console.log();

【问题讨论】:

  • 使用/* console.log('foo'); */的多行注释怎么样?
  • 是的,我的解决方案会对多行 cmets 产生误报。但我几乎只使用带有单行注释的 console.log。
  • @anubhava 即使你问到近 8 年前,也许这仍然与你有关,所以看看我的回答:stackoverflow.com/a/17147807/887930

标签: regex unix grep


【解决方案1】:

使用-L开关

grep -rL '//.*console\.log' directory

更新:

grep -rlP '^(?!.*//.*console\.log)(?=.*console\.log)' directory

【讨论】:

  • 这列出了没有注释 console.log 字符串的文件,这与同一行中带有 console.log 字符串且前面没有 // 的文件不同。这个答案几乎匹配每个文件,包括符合我需要的标准的文件。
  • @steampowered - 我的错。我已经用正确的解决方案更新了答案。
  • 这似乎有效。如果没有漏洞,我会更彻底地检查并标记它是正确的。谢谢!我认为解决方案可能需要环顾四周。
  • 谢谢,我在 vscode 中使用正则表达式 ^(?!.*//.*console\.log)(?=.*console\.log) 而不是 grep。
【解决方案2】:

扩展 Ωmega 的答案:为了找到多线 cmets (/* console.log(); */),另外使用:

^(?!.*//.*console\.log)^(?!.*/\*.*console\.log)(?=.*console\.log)

【讨论】:

    【解决方案3】:

    列出所有文件包含未注释的console.log的解决方案:

    grep -rlL "\/\/.*console\.log" /var/www/vhosts/mysite.com
    

    【讨论】:

    • 这几乎匹配每个文件,包括我需要的标准。谢谢你的尝试。 @Ωmega 在使用环视给出正确答案之前也是这样回答的。
    • 没问题。他比我快 3 分钟,但包括他的“编辑”,他比我晚了 30 分钟;)但最重要的是你得到了解决方案!干杯!
    【解决方案4】:

    您可以使用grep 中的-v 开关来使用反转匹配。

    grep -H -r "console\.log" /var/www/vhosts/mysite.com | grep -v "//"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2021-09-24
      • 2016-03-23
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多