我有一个包含内容的简单文本文件:
patent-inv
我要用 part1 \\ part2 取代 patent-inv
我是这样做的:
source_file = IO.read("#{Rails.root}/my_userdata/1.txt")
source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2")
File.open("#{Rails.root}/my_userdata/2.txt", "wb") {|f| f.write source_file }
但在文件中我得到了: part1的\第2部分
我尝试了几种方法,但结果相同:
source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2") => "part1\part2"
source_file.gsub!('<<<patent-inv>>>', "part1\\\part2") => "part1\part2"
source_file.gsub!('<<<patent-inv>>>', "part1\\part2") => "part1\part2"
有人可以帮我找出这种奇怪的行为吗?
答案 0 :(得分:3)
以下适用于我。你在终端试过吗?输出结果时可以取消转义。
> a = "<<<patent-inv>>>"
> a.gsub("<<<patent-inv>>>", "part1\\\\part2")
=> "part1\\part2"
您可以看到输出在puts
和p
> puts a
part1\part2
> p a
"part1\\part2"
> puts a.inspect
"part1\\part2"
编辑以下是您希望显示的输出。
1.9.2-p290 :037 > a.gsub!("<<<patent-inv>>>", "part1\\\\\\part2")
=> "part1\\\\part2"
> p a
"part1\\\\part2"
=> "part1\\\\part2"
> puts a
part1\\part2
=> nil
我们知道更改后的4个反斜杠在未转义时等于2个反斜杠。因此,在替换它以便正确显示之后,需要生成4个反斜杠。
答案 1 :(得分:2)
编辑纠正我的答案。由于puts
在输出时\
符号逃脱> str = "patent-inv"
=> "patent-inv"
> str.gsub!('patent-inv', "part1\\\\part2")
=> "part1\\part2"
> str.chars.each { |t| puts t }
p
a
r
t
1
\
p
a
r
t
2
=> "part1\\part2"
> str = "patent-inv"
=> "patent-inv"
> str.gsub!('patent-inv', "part1\\\\\\part2")
=> "part1\\\\part2"
> str.chars.each { |t| puts t }
p
a
r
t
1
\
\
p
a
r
t
2
=> "part1\\\\part2"
符号,因此我误导了我,因此我认为我实现了目标而没有实际存在。但是现在我有了它的工作。看我的实验:
str.chars.each { |t| puts t }
基本上我使用part1\\\\\\part2
来查看字符串中实际包含的字符。如您所见,正确的模式是{{1}}。
答案 2 :(得分:1)
尝试
source_file.gsub!('<<<patent-inv>>>', "part1\\\\\\\\part2") => "part1\part2"
=)