【问题标题】:How to gsub slash "/" with back slash and slash "\/" in ruby如何在ruby中用反斜杠和斜杠“\/”gsub斜杠“/”
【发布时间】:2010-02-22 01:58:49
【问题描述】:

我尝试通过 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 .... "

我只需要一个反斜杠

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

“运行”是来自 Capistrano 的命令

我的解决方案是

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

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

【问题讨论】:

  • real_path 的外观如何?我的意思是puts real_path 的输出是什么?正如我所说,您正在询问“/”到“\/”的修改,但您有gsub("\/", "\\/")
  • gsub("/","\\/") 和 gsub("\/","\\/") 将返回相同的结果。它会在“/”前添加一个“\\”

标签: ruby gsub


【解决方案1】:

你写过:

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)

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

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

【讨论】:

  • (1) 我尝试创建在“sed”命令中使用的“命令行字符串”,它需要看起来像“\/foo\/bar\/dir”的目录和完整的命令看起来像 - > 运行“sed 's/SHARE_PATH/\/foo\/bar\/dir/g' xxx.txt > yyy.txt”
  • (last) sed 命令需要 string 's///g' 这就是为什么我需要在我的目录路径中使用反斜杠。
【解决方案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,你会看到真正的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2010-12-14
    • 2021-05-29
    • 2011-09-06
    相关资源
    最近更新 更多