Как сделать косую черту "/" с обратной косой чертой и косой чертой "\ /" в рубине - PullRequest
3 голосов
/ 22 февраля 2010

Я пытаюсь изменить "/foo/bar/dir" на "\/foo\/bar\/dir" с помощью команды ruby ​​gsub.

Я проверяю это в 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"

результат выполнения команды "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 .... "

«Выполнить» - это команда из Капистрано

мое решение

использовать одинарную кавычку вместо двойной кавычки, как это

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

Ответы [ 2 ]

8 голосов
/ 22 февраля 2010

Вы написали:

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

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

но я не понимаю, зачем вам нужен обратный слеш в пути?

2 голосов
/ 22 февраля 2010

Да

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

Ваш первый пример на самом деле сделал то, что вы хотели, но метод .inspect, который использует irb, избегает обратной косой черты, так что, похоже, были дополнительные функции. Если бы вы использовали puts, вы бы увидели реальный результат.

...