首页 文章

如何gsub用反斜杠斜杠“/”并在ruby中斜杠“\ /”

提问于
浏览
3

我尝试通过ruby gsub命令将 "/foo/bar/dir" 修改为 "\/foo\/bar\/dir" .

我用irb测试它的结果是

x = "/foo/bar/dir"

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

=> "/foo/bar/dir"

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

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

Is it possible to replace "/" with "/" by 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"

“run”命令的结果是

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

我需要的只是一个反斜杠

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

“跑”是卡皮斯特拉诺的命令

my solution is

使用单引号而不是像这样的双引号

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

2 回答

  • 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 ,您会看到真实的结果 .

  • 8

    你写:

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

    所以你做了之前问过的事 . x.gsub("/","\\/") 实际上计算为 "\/foo\/bar\/dir" 但是irb打印 inspect 方法的返回值而不是 to_s .

    Edit: 你的意思是

    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.joindocumentation

    顺便说一句:为什么你这样修改路径? (1)

    Edit2: 为什么您要求将"/"更改为"/"但写下以下行?

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

    但我不明白为什么你需要在路径中反斜杠?

相关问题