2

コンテンツを含む単純なテキスト ファイルがあります。

   patent-inv

Patent-invpart1\\part2に置き換えます

私は次のようにしました:

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 に答える