考虑一下,我有一个包含以下文本的文件:
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"
替换为双倍空格" "
。这应该足够了