2

我有一个包含内容的简单文本文件:

   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\part2

我尝试了几种方法,但得到了相同的结果:

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"

任何人都可以帮我找出这种奇怪的行为吗?

4

3 回答 3

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 个反斜杠才能正确显示。

于 2012-04-20T07:29:25.320 回答
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.

于 2012-04-20T07:29:45.113 回答
1

尝试

source_file.gsub!('<<<patent-inv>>>', "part1\\\\\\\\part2") => "part1\part2"

=)

于 2012-04-20T07:32:17.800 回答