2015-09-11 44 views
1

我询问this question以获得站点上描述的特定模式的正确grep命令。现在我正在尝试处理文本文件 - 我在每行上使用修改的模式grep,如果grep返回匹配,我想采取一些操作。我的代码看起来或多或少是这样的:Ruby中的grep:递归调用可能无限循环

file.each_line do |line| 
    myVariable = `echo '#{line}' | grep -P '>(?!((?:[^)]|\((?1)\))*)$)'` 
    if myVariable == '' doSomething else doOtherThing end 
end 

每次调用回声grep的线,显示了这个:

grep: recursive call could loop indefinitely 

,并返回一个空字符串 - 这表明一个错误。

现在我也刊登了类似的行:

myVariable = `echo "#{line}" | grep -P '>(?!((?:[^]]|\[(?1)\])*)$)'` 

,但此行工作正常。

现在,我得到这个消息对于输入的每一行,但此行肯定给错误输出:

example <something> 

需要注意的是运行在命令行相同的COMAND,无论是与回声或文件,作品正好。

考虑到所有的信息,问题是:

我应该怎么做,以消除错误信息,使这个grep的呼叫工作?

+0

请使用snake_case作为变量。 CammelCase仅适用于课堂或模块 –

回答

0

原来,在Ruby中,你需要进行转义字符\与另一\。因此,结合vks's answer,我们得到:

myVariable = `echo "#{line}" | grep -P '<[^>]*>(?=[^\\[]*\\])'` 
myVariable = `echo "#{line}" | grep -P '<[^>]*>(?=[^\\(]*\\))'` 

其中工程分别为()[]或。

1
<[^>]*>(?=[^\[]*\]) 

你可以简单地使用。看到演示..

https://regex101.com/r/vV1wW6/9

+0

这对于我后面的()不起作用。 – MatthewRock

+0

另外,在编辑到'grep -P'<[^>] *>(?= [^ \(] * \))''后,我得到了“grep:unmatched括号” – MatthewRock