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



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

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

我认为这将起到删除字符的作用。我需要做些什么才能使它在文件夹中的所有文件中运行?

您澄清了您的问题,表示您希望从目录中文件的内容中删除某些字符。我创建了一种直接的方法来遍历目录(以及可选的子目录(并从文件内容中删除指定的字符。我使用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', '!$@')

我认为这可能会奏效,尽管我对Ruby中的Dir类有点不稳定。

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

这里有一个更通用的问题版本:遍历一个目录中的每个文件

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

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

相关内容

  • 没有找到相关文章

最新更新