如果文件夹中存在文件,则面对下面的问题。
H:\Ruby_test_works>ruby hurrah.rb
hurrah.rb:7:in `read': No such file or directory @ rb_sysopen - H:/Ruby_
test_works/SVNFolders.txt (Errno::ENOENT)
from hurrah.rb:7:in `block in <main>'
from hurrah.rb:4:in `each_line'
from hurrah.rb:4:in `<main>'
输入文件(input.txt)列以制表符分隔。
10.3.2.021.asd 10.3.2.041.def SVNFolders.txt
SubversionNotify Subversionweelta post-commit.bat
Commit message still rake customemail.txt
mckechney.com yahoo.in ReadMe.txt
代码:
dir = 'H:/Ruby_test_works'
file = File.open("#{dir}/input.txt", "r")
file.each_line do |line|
initial, final, file_name = line.split("\t")
#puts file_name
old_value = File.read("#{dir}/#{file_name}")
replace = old_value.gsub( /#{Regexp.escape(initial)}, #{Regexp.escape(final)}/)
File.open("#{dir}/#{file_name}", "w") { |fi| fi.puts replace }
end
我尝试使用向前和向后斜线,但没有运气。我错过了什么,不确定。感谢。
puts file_name
给出以下值
SVNFolders.txt
post-commit.bat
customemail.txt
ReadMe.txt
答案 0 :(得分:4)
<div class='crop'></div>
在结尾处包含换行符file_name
,但不会打印出来但会弄乱路径。您可以先解析\n
:
line
调试代码时,请注意initial, final, file_name = line.strip.split("\t")
。引用它的documentation揭示了一个丑陋的事实:
将给定对象写入ios。 在尚未以换行符结束的任何内容之后写入换行符。
另一种说法就是说它忽略了对象末尾的(潜在)换行符。这就是为什么你从未看到文件名实际上是puts
。
您可以在排查问题时使用SVNFolders.txt\n
,而不是使用puts
。两者之间的非常短的比较是p
调用puts
并添加换行符,而to_s
调用p
对象。以下是有关差异的更多详细信息:http://www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/