从多个文件中删除某些字符

时间:2014-03-18 17:28:49

标签: ruby file

我想从文件夹中的多个文件中删除以下字符。到目前为止我所拥有的是:

str.delete! '!@#$%^&*() 

我认为这将删除字符。如何让它运行文件夹中的所有文件?

3 个答案:

答案 0 :(得分:0)

我认为这可能有用,虽然我对Ruby中的Dir类有些不稳定。

Dir.foreach('/path/to/dir') do |file|
  file.delete '!@#$%^&*() 
end

这里有一个更通用的问题版本:Iterate through every file in one directory

希望能得到一个更彻底的答案,但也许这会让你找到你需要的地方。

答案 1 :(得分:0)

您澄清了您的问题,说明您要从目录中文件的内容中删除某些字符。我创建了一种直接的方法来遍历目录(以及可选的子目录)并从文件内容中删除指定的字符。我开始使用String#delete。如果要删除更多高级模式,可能需要使用正则表达式将其更改为String#gsub

下面的示例将遍历相对于当前工作目录的tmp目录(以及所有子目录),并删除所有出现的!$@找到的文件。您当然也可以传递绝对路径,例如C:/some/dir。请注意,我不对文件进行过滤,我认为它是所有文本文件。如果您愿意,您当然可以添加文件扩展名检查。

def replace_in_files(dir, chars, subdirs=true)
  Dir[dir + '/*'].each do |file|
    if File.directory?(file) # Traverse inner directories if subdirs == true
      replace_in_files(file, chars, subdirs) if subdirs
    else # Replace file contents
      replaced = File.read(file).delete(chars)
      File.write(file, replaced)
    end
  end
end

replace_in_files('tmp', '!$@')

答案 2 :(得分:0)

Dir.foreach('filepath') do |f|
    next if Dir.exists?(f)
    file = File.new("filepath/#{f}",'r+')
    text = file.read.delete("'!@#$%^&*()")
    file.rewind
    file.write(text)
    file.close
end

你不能做的原因

file.write(file.read.delete("'!@#$%^&*()"))

是file.read在文本末尾留下“光标”。您可以附加到文件,而不是写入文件,而不是您想要的文件。

您还可以向File类添加一个方法,将光标移动到文件的开头。

class File
    def newRead
        data = self.read
        self.rewind
        data
    end
end

Dir.foreach('filepath') do |f|
    next if Dir.exists?(f)
    file = File.new("filepath/#{f}",'r+')
    file.write(file.newRead.delete("'!@#$%^&*()"))
    file.close
end