Regex 用于从Open3.popen3标准输出中提取值的正则表达式

Regex 用于从Open3.popen3标准输出中提取值的正则表达式,regex,ruby,regex-group,Regex,Ruby,Regex Group,如何获取外部命令的输出并从中提取值 我有这样的想法: stdin, stdout, stderr, wait_thr = Open3.popen3("#{path}/foobar", configfile) if /exit 0/ =~ wait_thr.value.to_s runlog.puts("Foobar exited normally.\n") puts "Test completed." someoutputvalue = stdout.read("TX.

如何获取外部命令的输出并从中提取值

我有这样的想法:

stdin, stdout, stderr, wait_thr = Open3.popen3("#{path}/foobar", configfile)

if /exit 0/ =~ wait_thr.value.to_s
    runlog.puts("Foobar exited normally.\n")
    puts "Test completed."
    someoutputvalue = stdout.read("TX.*\s+(\d+)\s+")
    puts "Output value: " + someoutputvalue
end
我没有在标准输出上使用正确的方法,因为Ruby告诉我它不能将字符串转换为整数

例如,如果输出是

"TX So and so:     28"
我只想得到“
28
”。我验证了上面的正则表达式是否与我需要匹配的匹配,我只是想知道如何将提取的值存储在变量中


正确的做法是什么?我在文档中的任何地方都找不到stdout可用的方法。我使用的是
stout。请阅读Ruby 1.9.3中的

所需的所有信息都在中,但您必须仔细阅读并查看示例。您还可以从数据库中收集有用的信息

也许这会更好地展示它:

require 'open3'

captured_stdout = ''
captured_stderr = ''
exit_status = Open3.popen3(ENV, 'date') {|stdin, stdout, stderr, wait_thr|
  pid = wait_thr.pid # pid of the started process.
  stdin.close
  captured_stdout = stdout.read
  captured_stderr = stderr.read
  wait_thr.value # Process::Status object returned.
}

puts "STDOUT: " + captured_stdout
puts "STDERR: " + captured_stderr
puts "EXIT STATUS: " + (exit_status.success? ? 'succeeded' : 'failed')
运行输出:

STDOUT: Wed Jun 12 07:07:12 MST 2013
STDERR:
EXIT STATUS: succeeded
注意事项:

  • 通常需要
    关闭
    stdin
    流。如果被调用的应用程序希望输入STDIN,它将挂起,直到看到流关闭,然后继续处理
  • stdin
    stdout
    stderr
    都是IO句柄,因此您必须阅读以了解可用的方法
  • 您必须使用
    put
    print
    write
    read
    stdout
    stderr
    中获取
    输出到
    stdin
  • exit\u status
    不是字符串,它是Process::status类的实例。你可以尝试从它的
    版本解析到_s
    版本,但不要这样做。而是使用访问器查看它返回的内容
  • 我传入了
    ENV
    散列,因此子程序可以访问父程序看到的整个环境。没有必要这样做;相反,如果您不想让孩子访问所有内容,您可以为孩子创建一个简化的环境,或者您可以通过更改值来扰乱孩子对环境的看法
  • 问题中发布的代码
    stdout.read(“TX.*\s+(\d+)\s+”)
    是,嗯。。。胡说我不知道你从哪里得到的,因为Ruby的IO类中没有关于or的文档
如果您不需要写入被调用代码的STDIN,则更容易使用
capture3

require 'open3'

stdout, stderr, exit_status = Open3.capture3('date')

puts "STDOUT: " + stdout
puts "STDERR: " + stderr
puts "EXIT STATUS: " + (exit_status.success? ? 'succeeded' : 'failed')
哪些产出:

STDOUT: Wed Jun 12 07:23:23 MST 2013
STDERR:
EXIT STATUS: succeeded
Today is: Jun 12 2013

使用正则表达式从字符串中提取值是很简单的,这一点已被。从上一个代码示例开始:

stdout[/^\w+ (\w+ \d+) .+ (\d+)$/]
puts "Today is: " + [$1, $2].join(' ')
哪些产出:

STDOUT: Wed Jun 12 07:23:23 MST 2013
STDERR:
EXIT STATUS: succeeded
Today is: Jun 12 2013
这是使用非常灵活的方法

另一种方法是使用“命名捕获”:


如果您不想与流程通信,只想读取其输出,
capture3
会更合适(也更简单)。读取的参数是什么?我以为你唯一的论点是你要去多远?也许它试图将字符串参数视为整数字节数?@JoePym该参数是foobar用来运行的XML文件,如果这是您的问题的话。我认为这就是问题所在:Open3.popen3(“grep”)do | stin、stdout、stderr | stdout.read(“aaa”)end引发了相同的错误。在流案例中,您要读取的参数是要在流中查找的字节数。是否要对流应用正则表达式而不是查找字节?由于我对Ruby方法缺乏了解,我想这是一个核心问题:)但是如果我只是
放置stdout.read
它打印正确,为什么需要使用中间变量(在我的例子中,regex是在块中完成的,所以没有范围问题)?在您的示例中,如何在捕获的stdout上使用正则表达式提取值?我将其存储在一个中间变量中,以向您展示如何从块外部访问该值。如果你不需要那么做,那就不要。你可以使用一个普通的正则表达式或一个子字符串从
captured\u stdout
中提取一个值,这没有什么神秘或神奇的,它是一个包含被调用代码返回的任何内容的字符串。我仔细阅读了文档,我的问题是关于Ruby的更一般的问题,基本上是询问如何通过正则表达式存储从字符串中提取的值,Popen3文档中没有涉及到这一点。。据我所知,也没有Regexp文档。你给出的例子已经对我有用了,因为我已经阅读了文档。那么你的问题就是在转移注意力。如果你想知道如何使用正则表达式,就把你的问题简化成这个问题。我将添加一个示例。