Как сделать gsub косой чертой / с обратной косой чертой и косой чертой \/ в ruby

Я пытаюсь изменить "/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"

результат команды "выполнить"

"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("/",'\/') 

person Community    schedule 22.02.2010    source источник
comment
Как выглядит real_path? Я имею в виду, каков результат puts real_path? Как я уже сказал, Вы спрашиваете о модификации, но у Вас есть gsub("\/", "\\/")   -  person Dawid    schedule 22.02.2010
comment
gsub(/,\\/) и gsub(\/,\\/) вернут один и тот же результат. Он добавит один \\ перед /   -  person Bank    schedule 24.02.2010


Ответы (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

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

person DigitalRoss    schedule 22.02.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) ?

Изменить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
>>

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

person Dawid    schedule 22.02.2010
comment
(1) Я пытаюсь создать строку командной строки, которая используется в команде sed, ей нужен каталог, который выглядит как \/foo\/bar\/dir, а полная команда выглядит как -> run sed 's/SHARE_PATH/\/foo\/bar \/dir/g' xxx.txt › yyy.txt - person Bank; 22.02.2010
comment
(последняя) команда sed нуждается в строке 's/‹string 1›/‹string 2›/g' Вот почему мне нужна обратная косая черта в моем пути к каталогу. - person Bank; 22.02.2010