在Lua中处理管道io

在Lua中处理管道io,io,lua,pipe,stdin,Io,Lua,Pipe,Stdin,我已经为此搜索了很多,但在任何地方都找不到答案。我正在尝试做如下事情: cat somefile.txt|grep somepattern|/script.lua 我还没有在Lua中找到一个处理管道io的资源,也不知道如何做。有没有一个好的方法,非黑客的方法来解决它?最好是缓冲以降低内存使用,但如果这是唯一的选择,我会满足于一次读取整个文件 如果必须将其写入临时文件,然后将其加载到程序中,那将非常令人失望 提前感谢。标准库有一个io.stdin和一个io.stdout,您可以使用它进行输入和输出

我已经为此搜索了很多,但在任何地方都找不到答案。我正在尝试做如下事情:

cat somefile.txt|grep somepattern|/script.lua

我还没有在Lua中找到一个处理管道io的资源,也不知道如何做。有没有一个好的方法,非黑客的方法来解决它?最好是缓冲以降低内存使用,但如果这是唯一的选择,我会满足于一次读取整个文件

如果必须将其写入临时文件,然后将其加载到程序中,那将非常令人失望


提前感谢。

标准库有一个
io.stdin
和一个
io.stdout
,您可以使用它进行输入和输出,而不必求助于临时文件。您还可以使用
io.read
isntead of
someFile:read
,默认情况下它将从stdin读取

缓冲由提供管道的操作系统负责。在编写程序时,您不需要太担心它


编辑:显然,当您提到缓冲时,您考虑的是读取文件的一部分,而不是将整个文件加载到字符串中
io.read
可以使用数值参数从输入中读取一定数量的字节,如果无法读取任何字符,则返回
nil

local size = 2^13      -- good buffer size (8K)
while true do
  local block = io.read(size)
  if not block then break end
  io.write(block)
end

标准库有一个
io.stdin
和一个
io.stdout
,您可以使用它进行输入和输出,而不必求助于临时文件。您还可以使用
io.read
isntead of
someFile:read
,默认情况下它将从stdin读取

缓冲由提供管道的操作系统负责。在编写程序时,您不需要太担心它


编辑:显然,当您提到缓冲时,您考虑的是读取文件的一部分,而不是将整个文件加载到字符串中
io.read
可以使用数值参数从输入中读取一定数量的字节,如果无法读取任何字符,则返回
nil

local size = 2^13      -- good buffer size (8K)
while true do
  local block = io.read(size)
  if not block then break end
  io.write(block)
end
另一个(更简单的)替代方法是io.lines()迭代器,但括号内没有文件名。例如:

for line in io.lines() do
  print(line)
end
function io.chars(n,filename)
  n = n or 1                  --default number of characters to read at a time
  local chars = ''
  local wrap, yield = coroutine.wrap, coroutine.yield
  return wrap(function()
                for line in io.lines(filename) do
                  line = chars .. line .. '\n'
                  while #line >= n do
                    yield(line:sub(1,n))
                    line = line:sub(n+1)
                  end
                  chars = line
                end
                if chars ~= '' then yield(chars) end
              end)
end

for text in io.chars(30) do
  io.write(text)
end
更新:要获得大量字符,您可以围绕它编写一个包装器。例如:

for line in io.lines() do
  print(line)
end
function io.chars(n,filename)
  n = n or 1                  --default number of characters to read at a time
  local chars = ''
  local wrap, yield = coroutine.wrap, coroutine.yield
  return wrap(function()
                for line in io.lines(filename) do
                  line = chars .. line .. '\n'
                  while #line >= n do
                    yield(line:sub(1,n))
                    line = line:sub(n+1)
                  end
                  chars = line
                end
                if chars ~= '' then yield(chars) end
              end)
end

for text in io.chars(30) do
  io.write(text)
end
另一个(更简单的)替代方法是io.lines()迭代器,但括号内没有文件名。例如:

for line in io.lines() do
  print(line)
end
function io.chars(n,filename)
  n = n or 1                  --default number of characters to read at a time
  local chars = ''
  local wrap, yield = coroutine.wrap, coroutine.yield
  return wrap(function()
                for line in io.lines(filename) do
                  line = chars .. line .. '\n'
                  while #line >= n do
                    yield(line:sub(1,n))
                    line = line:sub(n+1)
                  end
                  chars = line
                end
                if chars ~= '' then yield(chars) end
              end)
end

for text in io.chars(30) do
  io.write(text)
end
更新:要获得大量字符,您可以围绕它编写一个包装器。例如:

for line in io.lines() do
  print(line)
end
function io.chars(n,filename)
  n = n or 1                  --default number of characters to read at a time
  local chars = ''
  local wrap, yield = coroutine.wrap, coroutine.yield
  return wrap(function()
                for line in io.lines(filename) do
                  line = chars .. line .. '\n'
                  while #line >= n do
                    yield(line:sub(1,n))
                    line = line:sub(n+1)
                  end
                  chars = line
                end
                if chars ~= '' then yield(chars) end
              end)
end

for text in io.chars(30) do
  io.write(text)
end

这一页的最后一块对我来说已经很好了,如果你能在回答中加入这个例子,那就太酷了。这正是我所说的缓冲。这相当于将stdin中的n个字节读入一个数组,而不是将整个文件一次读入C中的内存。谢谢。页面的最后一块对我来说是解决问题的方法,如果你能在回答中包含这个例子,那就太酷了。这正是我所说的缓冲。这相当于从stdin读取n个字节到一个数组中,而不是在C中一次将整个文件拉入内存。谢谢。这让我想起了Python,谢谢你的提示!有没有办法让它不用读一行,而是读
n
chars?让我想起Python,谢谢你的提示!有没有办法让它不用读一行,而是读
n
chars?