我尝试通过ruby gsub命令将"/foo/bar/dir"
修改为"\/foo\/bar\/dir"
。
我在irb中测试结果是
x = "/foo/bar/dir"
x.gsub("/","\/")
=> "/foo/bar/dir"
x.gsub("/","\\/")
=> "\\/foo\\/bar\\/dir"
是否可以用gsub将“/”替换为“/”?
问题来源:
我尝试执行“string in command line”,“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 .... "
我需要的只是一个反斜杠,如
"sh -c 'sed '\''s/SHARE_PATH/\/home\/me\/www\/idata\/shared/g .... "
“run”是来自Capistrano的命令
我的解决方案
使用单引号而不是像这样的双引号
path = real_path.gsub("/",'\/')
答案 0 :(得分: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
(documentation)
顺便说一下:你为什么要用这种方式修改路径? (1)
编辑2:您为什么要求将“/”更改为“/”,但请写下以下内容?
path = real_path.gsub("\/","\\/")
你想要达到什么目的?您对问题(1)
的答案是什么?
<强> EDIT3:强>
我们走了:
>> 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
>>
但我不明白为什么你需要在路径中反斜杠?
答案 1 :(得分: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
你的第一个例子实际上做了你想要的,但是irb正在使用的.inspect
方法是转义反斜杠,所以看起来有额外的东西。如果您使用过puts
,您会看到真实结果。