Ruby中的Grep:递归调用可以无限循环

时间:2015-09-11 10:52:15

标签: ruby regex grep

我要求this question为网站上描述的特定模式获取正确的grep命令。现在我正在尝试处理文本文件 - 我在每一行使用修改的模式grep,如果grep返回匹配,我想采取一些操作。我的代码或多或少看起来像这样:

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

每次调用echo-grep行都会显示:

grep: recursive call could loop indefinitely

并返回一个空字符串 - 表示错误。

现在我也在运行类似的行:

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

但这条线路正常。

现在我为每一行输入都收到了这条消息,但是这一行肯定会给出错误输出:

example <something>

请注意,在命令行中使用echo或on file运行相同的命令,效果很好。

鉴于所有信息,问题是:

我应该怎么做才能消除错误信息,并使这个grep调用工作?

2 个答案:

答案 0 :(得分:1)

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

你可以简单地使用它。参见演示..

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

答案 1 :(得分:0)

事实证明,在Ruby中,您需要使用另一个\转义\个字符。因此,合并vks's answer,我们得到:

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

分别适用于[]或()。