2015-05-06 2 views
1

Я использую ruby, и я хочу удалить конечные пробелы в конце каждой строки в файле.Удалить конечные пробелы из каждой строки в файле

Один из способов сделать это, итерации по очереди и сохранить его в другом файле, а затем заменить новый файл на старый.

temp_file = Tempfile.new("temp") 
    f.each_line do |line| 
    new_line = line.rstrip 
    temp_file.puts new_line 
    end 

но это не то, что я хочу. Я хочу использовать метод, который мы обычно используем в C, C++ без использования какого-либо временного файла, который перемещает указатель файла в начало строки по новой строке и перезаписывает его.

Как мы можем это сделать в рубине ??

+2

Почему вы «хотите использовать метод, который мы обычно используем в C, C++ без использования какого-либо временного файла»? –

+0

«метод, который мы обычно используем в C, C++ ...» - можете ли вы привести пример этого метода? Обратите внимание: API Ruby IO довольно близко соответствует API C, поэтому вы можете делать все, что вы можете сделать в C с Ruby. – matt

ответ

1

Вот один из способов изменить содержимое файла на месте.

# a.rb 
File.open "#{__dir__}/out1.txt", 'r+' do |io| 
    r_pos = w_pos = 0 

    while (io.seek(r_pos, IO::SEEK_SET); io.gets) 
    r_pos = io.tell 
    io.seek(w_pos, IO::SEEK_SET) 
    # line read in by IO#gets will be returned and also assigned to $_. 
    io.puts $_.rstrip 
    w_pos = io.tell 
    end 

    io.truncate(w_pos) 
end 

Вот вывод файла.

[[email protected]]$ cat out1.txt 
foo 
    biz 
bar 

[[email protected]]$ ruby a.rb 
[[email protected]]$ cat out1.txt 
foo 
    biz 
bar 

[[email protected]]$ 
+0

отлично смотря, используйте rstrip вместо простой полосы, потому что я хочу удалить задние пробелы, а не с самого начала. – user3078630

+0

@ user3078630 Done! .. –

+0

Просто немного измените, как показано ниже, чтобы избежать бесконечной петли. 'while (io.seek (r_pos, IO :: SEEK_SET); io.gets) r_pos = io.tell io.seek (w_pos, IO :: SEEK_SET) if io.eof? break конец io.puts $ _. Rstrip w_pos = io.tell конец' – user3078630

0

Вы можете использовать что-то вроде:

file_name = 'testFile.txt' 

input_content = File.open(file_name).read 
output_content = [] 

file.each_line do |line| 
    line.gsub!("\n",'').strip! 
    output_content << line 
end 

File.open(file_name,'w').write(output_content.join("\n")) 
Смежные вопросы