如何在 Ruby 文本文件中向右移动所有行



考虑一下,我有一个包含以下文本的文件:

create_table "users", force: :cascade do |t|
  t.integer "age"
  t.string  "first_name"
  t.string  "last_name"
end
将其

向右移动的巧妙方法是什么,就好像每行之前都有"\t"符号一样?

  create_table "users", force: :cascade do |t|
    t.integer "age"
    t.string  "first_name"
    t.string  "last_name"
  end

我的问题与文本编辑器无关。我问如何以编程方式移动文件中的文本。

您可以通过逐行处理文件并写入新文件来执行此操作。 尝试这样的事情:

spaces = 8
original_filename = 'outdented.txt'
new_filename = 'indented.txt'
File.open(new_filename, 'w') do |out_file|
  File.foreach(original_filename) do |line|
     out_file.puts "#{" "*spaces}#{line}"
  end
end

在此文件(outdented.txt)上运行时:

This file is not indented
Each line rests against the left margin
  Except this line
And that's all this file does

产生此输出 ( indented.txt ):

        This file is not indented
        Each line rests against the left margin
          Except this line
        And that's all this file does

如果您愿意,可以删除原始文件并将新文件重命名为原始文件名:

File.delete(original_filename)
File.rename(new_filename, original_filename)

如果您更喜欢制表符,可以选择将spaces变量替换为tabs变量,并将字符更改为输出:

tabs = 2
original_filename = 'outdented.txt'
new_filename = 'indented.txt'
File.open(new_filename, 'w') do |out_file|
  File.foreach(original_filename) do |line|
     out_file.puts "#{"t"*tabs}#{line}"
  end
end

首先,让我们构造一个要读取的文件。

str =<<_
create_table "users", force: :cascade do |t|
  t.integer "age"
  t.string  "first_name"
  t.string  "last_name"
end
_
FNameIn  = "temp_in"
FNameOut = "temp_out"
File.write(FNameIn,str)
  #=> 116

写入文件的 116 个字符。

如果你的文件不大(小到足以"吞噬"它),这将可以:

insert = ' '{4}
File.write(FNameOut, File.read(FNameIn).gsub(/^/,"#{insert}"))
  #=> 136

/^/匹配每行的开头。

要确认:

puts File.read(FNameOut)
    create_table "users", force: :cascade do |t|
      t.integer "age"
      t.string  "first_name"
      t.string  "last_name"
    end

要替换文件:

FNameOut = FNameIn

这取决于您使用的文本编辑器。

例如,崇高文本允许您以多种方式执行此操作(使用右键单击选择列..)

编辑后

使用 Tab t进行缩进不是一个好的做法。最好的方法是将所有制表符"t"替换为双倍空格" "。这应该足够了

最新更新