如何在目录中的所有文件中创建多行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;
};
答案 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!"
}
答案 2 :(得分:0)
使用 grep 。
我不确定我理解你的问题,但你的解决方案有效。 您只需要在正则表达式中进行一些小的更改:
grep -RPzo 'var Class = function\((.|\n)*?\n\};' ./
(.|\n)*?
为了有可能有换行符(尽可能少=不贪婪)\n\};
获得典型的结束功能