如何将系统 grep 结果导入 ruby

Use*_*159 2 ruby shell grep

我目前正在 grep 系统并将结果返回到 ruby​​ 中进行操作。

def grep_system(search_str, dir, filename)
   cmd_str ="grep -R '#{search_str}' #{dir} > #{filename}"
   system(cmd_str)
   lines_array = File.open(filename, "r").read.split("\n)
end
Run Code Online (Sandbox Code Playgroud)

如您所见,我只是将 grep 的结果写入临时文件,然后使用“File.open”重新打开该文件。

有一个更好的方法吗?

mu *_*ort 5

永远不要做这样的事情:

cmd_str ="grep -R '#{search_str}' #{dir}"
Run Code Online (Sandbox Code Playgroud)

想都别想。迟早search_strdir包含 shell 会以意想不到的方式解释的内容。根本不需要调用 shell,您可以Open3.capture3这样使用:

lines    = Open3.capture3('grep', '-R', search_str, dir).first
lines, _ = Open3.capture3('grep', '-R', search_str, dir)
Run Code Online (Sandbox Code Playgroud)

这将为您留下一个换行分隔列表lines,从那里应该很容易。

这将grep直接调用,根本不使用 shell。capture3还可以很好地让您忽略(或捕获)命令,stderr而不是stderr默认将其打印到您所在的任何地方。

如果您使用这种形式的capture3,则不必担心 shell 元字符或引用或不卫生的输入。

类似地system,如果您想与参数一起使用,system则可以使用多参数版本:

system('ls', some_var)
Run Code Online (Sandbox Code Playgroud)

而不是潜在的危险:

system("ls #{some_var}")
Run Code Online (Sandbox Code Playgroud)