3

ruby の gsub コマンドで変更"/foo/bar/dir"してみます。"\/foo\/bar\/dir"

私はirbでそれをテストし、結果は

x = "/foo/bar/dir"

x.gsub("/","\/")

=> "/foo/bar/dir"

x.gsub("/","\\/")

=> "\\/foo\\/bar\\/dir"

gsub で「/」を「/」に置き換えることはできますか?


問題の原因:

「コマンドラインで文字列」を実行しようとしましたが、「real_path」が変数です

real_path = "/home/me/www/idata"

path = real_path.gsub("/","\\/")

=> \\/home\\/me\\/www\\/idata 

# But what I expect is \/home\/me\/www\/idata

run "sed 's/SHARE_PATH/#{path}/g' #{path}/config/sphinx.yml > #{path}/config/sphinx.tmp.yml"

「実行」コマンドの結果は

"sh -c 'sed '\''s/SHARE_PATH/\\/home\\/me\\/www\\/idata\\/shared/g .... "

必要なのは、次のようなバックスラッシュ 1 つだけです

"sh -c 'sed '\''s/SHARE_PATH/\/home\/me\/www\/idata\/shared/g .... "

「実行」はカピストラーノからのコマンドです

私の解決策は

このように二重引用符の代わりに単一引用符を使用してください

path = real_path.gsub("/",'\/') 
4

2 に答える 2

8

あなたが書いた:

x = "/foo/bar/dir"
x.gsub("/","\\/")
=> "\\/foo\\/bar\\/dir"

それで、あなたは以前に求めたことをしました。x.gsub("/","\\/")実際には と評価され"\/foo\/bar\/dir"ますが、irb は のinspect代わりにメソッドの戻り値を出力しますto_s

編集:もしかして

real_path.gsub("/","\/")

代わりに

real_path.gsub("\/","\/")

とにかく、出力は正しいです-あなたはそう変更/しました\/

"sh -c 'sed '\''s/SHARE_PATH/\/home\/me\/www\/idata\/shared/g'\'' .... "`

それ以外の

`"sh -c 'sed '\''s/SHARE_PATH//home/me/www/idata/shared/g'\'' .... "`

また、結果は irb の結果とは異なります (二重のバックスラッシュがないことに注意してください)。

パス操作については、File.joinドキュメント)を使用することをお勧めします

ところで、なぜこのようにパスを変更しているのですか?(1)

Edit2:「/」を「/」に変更することを求めているのに、次の行を書くのはなぜですか?

path = real_path.gsub("\/","\\/") 

あなたは何を達成しようとしていますか?そして、質問に対するあなたの答えは何(1)ですか?

編集3:

さあ行こう:

>> real_path = "/foo/bar/dir"
=> "/foo/bar/dir"
>> path = real_path.gsub("/", "\\/")
=> "\\/foo\\/bar\\/dir"
>> puts "sed 's/SHARE_PATH/#{path}/g' #{path}/config/sphinx.yml > #{path}/config/sphinx.tmp.yml"
sed 's/SHARE_PATH/\/foo\/bar\/dir/g' \/foo\/bar\/dir/config/sphinx.yml > \/foo\/bar\/dir/config/sphinx.tmp.yml
=> nil
>>

しかし、パスにバックスラッシュが必要な理由がわかりませんか?

于 2010-02-22T02:06:49.473 に答える
2

はい

irb(main):028:0> (t = x.gsub("/", "\\/")) && nil
=> nil
irb(main):029:0> t
=> "\\/foo\\/bar\\/dir"
irb(main):030:0> puts t
\/foo\/bar\/dir
=> nil

あなたの最初の例は実際にあなたが望んでいたことをしましたが、.inspectirb が使用している方法はバックスラッシュをエスケープしているため、余分なものがあるように見えました。使用していればputs、実際の結果が表示されたはずです。

于 2010-02-22T02:04:37.170 に答える