Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从多个文件中删除某些字符_Ruby_File - Fatal编程技术网

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

Ruby 从多个文件中删除某些字符,ruby,file,Ruby,File,我想从文件夹中的几个文件中删除以下字符。到目前为止,我得到的是: str.delete! '!@#$%^&*() 我认为这将有助于删除字符。我需要做什么才能使它在文件夹中的所有文件中运行?我认为这可能会起作用,尽管我对Ruby中的Dir类有点不确定 Dir.foreach('/path/to/dir') do |file| file.delete '!@#$%^&*() end 这里有一个更一般的问题: 希望能有一个更全面的答案,但也许这会让你找到你需要的地方。你澄清

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

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

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

我认为这可能会起作用,尽管我对Ruby中的Dir类有点不确定

Dir.foreach('/path/to/dir') do |file|
  file.delete '!@#$%^&*() 
end
这里有一个更一般的问题:


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

你澄清了你的问题,说你想从目录中的文件内容中删除某些字符。我创建了一种直接的方法来遍历目录和可选的子目录,并从文件内容中删除指定的字符。我使用了Stringdelete,就像你开始使用的一样。如果要删除更高级的模式,可能需要将其更改为带有正则表达式的StringSub

下面的示例将遍历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', '!$@')
你不能做的原因

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

您想对输出做什么?如果不对其执行任何操作,则替换的字符串将消失。如果这些字符是文本文件,是否要从文件名或文件内容中删除这些字符?我要从文件内容中删除它们。基本上,我只需要它运行一个目录中的所有文件,从所有文件中删除这些字符的任何实例,然后保持文件名不变;文件的文件名。调用.delete将从文件名字符串中删除指定的字符。但是,它保持实际文件名不变。这将需要您重命名该文件。这也不会从文件内容中删除这些字符。我不确定应该发生什么,问题还不清楚。所以基本上我想不去管文件名,只从实际文件中删除指定的字符。如果不清楚,很抱歉。您好,谢谢您的回复。由于某种原因,我无法让它工作。我是否将脚本放在与我希望它更改并运行的文本文件相同的目录中?或者我需要创建一个绝对路径。抱歉,我需要更多帮助:@user3434301您可以将脚本放置在任何位置,并且您可以使用绝对路径作为参数,例如:C:/users/yourname/desktop/folder或相对路径,例如,如果您将脚本放置在桌面上,并且“folder”是桌面上的文件夹,则使用folder。不要将它放在同一目录中,那么它也会替换脚本源文件中的字符:只需将它放在父目录中,例如,如果您的文件位于C:/data/files中,则将脚本放在C:/data中,并使用“files”作为第一个参数进行调用。您好,Daniël,再次感谢您的回复。我将脚本中dir的每个实例都更改为TestX文件夹的名称,它会抛出一个错误。除了脚本中的dir,我还应该更改什么吗?我只是将文件夹的名称放在双引号TextX中,得到了以下错误:语法错误,意外的“,”,需要输入def replace_in_filetextx,chars,subdirs=trueWhat?天哪,你只需更换最后一行的“tmp”。。。因此,如果您将脚本放在C:/data中,并且您有一个文件夹C:/data/files和文本文件,那么您可以将“tmp”替换为“files”,然后运行放置在C:/data中的脚本。嘿,Jordan,感谢您的回复。我试图使用以下代码:Dir.foreach'filepath'do | f | next if Dir.exists?f file=file.newfilepath/{f},'r+'text=file.read.delete'!@$%^&*file.rewind file.writetext file.close end我将文件路径添加到dir.foreach,但在添加到file.new时抛出错误。它应该是这样的吗?file=file.new\Users\Tim\Test/{f},'r+'还是我做错了什么?我在文件路径中使用的是Win7,请使用“/”而不是“\”。另外,确保您的ruby文件位于与删除字符的目录不同的目录中。希望有帮助
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