多行grep以递归方式查找变量(构造函数)定义

时间:2014-03-10 07:35:15

标签: regex linux bash grep

如何在目录中的所有文件中创建多行grep,在两种模式之间打印出字符串,包括模式本身?

我尝试使用了几种变体,但是我很喜欢使用匹配多行的RegExp。

grep -RPzo "var Class = (.*) \};" ./
grep -RPzo "var Class = function\(\{(.*)\};" ./

grep命令应该递归查找所有文件并打印出所有内容(包括)“var Class =”和第一个“};”发生在它之后,可能是在几次换行之后。这是否可以仅使用grep(而不是pcregrep)?

JavaScript函数定义的第一个模式工作正常,所以这就是我被困住的地方:

grep -RPzo "var Class = function\((.*)\)\s\{" ./

应该匹配的内容的示例定义(以便更轻松地尝试):

var Class = function(data, game) {

    var settings = lychee.extend({}, data);

    this.foo = { x: 0, y: 0, z: 0 };


    this.setFoo(settings.foo);

    lychee.game.Bar.call(this, settings);

    settings = null;

};

3 个答案:

答案 0 :(得分:0)

就我个人而言,我会考虑使用sed

sed -n '/start-marker/,/end-marker/p' <(echo -en "first line\nstart-marker\notherline\nend-marker\nmore\na")

此命令将匹配并打印start-marker中的行,直至匹配end-marker

你仍然需要根据你的模式进行调整,但是sed应该为你做好准备。

为了清楚起见,一行回显输出:

echo -en "first line\nstart-marker\notherline\nend-marker\nmore\na"
first line
start-marker
otherline
end-marker
more
a

我用这个sed命令工作了:

sed  -n '/var Class =/,/^\};/p' /tmp/sample

请注意,我使用^\};来匹配行开头的括号,而不是在此行this.foo = { x: 0, y: 0, z: 0 };处停止。

答案 1 :(得分:0)

或者使用gAWK!

{
   if( $0 ~ /\{/ )
      cbo++;
   if( $0 ~ /\}/ )
      cbo--;
   if( cbo == 1 && $0 ~ "^([[:space:]]?+)(.+)([[:space:]]+)\\{$" )
      rec=1
   if( rec == 1 )
      buff = ( buff ? buff "\n" : "" ) $0
   if( cbo == 0 )
      rec=0
} END {   
   if( cbo == 0 )
      print buff
   else 
      print "Dude something funkey goes on with ur input... " cbo " brackets are left open!"
}

实施例: http://pastebin.com/TTCHBPvm

答案 2 :(得分:0)

使用 grep

我不确定我理解你的问题,但你的解决方案有效。 您只需要在正则表达式中进行一些小的更改:

grep -RPzo 'var Class = function\((.|\n)*?\n\};' ./
  • (.|\n)*?为了有可能有换行符(尽可能少=不贪婪)
  • \n\};获得典型的结束功能