Cómo gsub barra “/” con la barra inclinada hacia atrás y barra “\ /” en rubí
Pregunta
Intento de modificar "/foo/bar/dir"
a "\/foo\/bar\/dir"
por orden de rubí gsub.
lo prueba en el IRB el resultado es
x = "/foo/bar/dir"
x.gsub("/","\/")
=> "/foo/bar/dir"
x.gsub("/","\\/")
=> "\\/foo\\/bar\\/dir"
¿Es posible sustituir "/" con "/" por gsub?
Fuente de problemas:
intento ejecutar "cadena en la línea de comandos" y "real_path" es mi variables
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"
Resultado del comando "Ejecutar" es
"sh -c 'sed '\''s/SHARE_PATH/\\/home\\/me\\/www\\/idata\\/shared/g .... "
Me necesidad es sólo una barra invertida como
"sh -c 'sed '\''s/SHARE_PATH/\/home\/me\/www\/idata\/shared/g .... "
"run" es la orden de Capistrano
mi solución es
utilizar comilla simple en lugar de comillas dobles como esto
path = real_path.gsub("/",'\/')
Solución
Sí
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
Su primer ejemplo realmente hizo lo que quería, pero el método IRB .inspect
que está utilizando es escapar las barras invertidas, por lo que parecía que había extras. Si se hubiera usado puts
que habría visto el resultado real.
Otros consejos
Usted ha escrito:
x = "/foo/bar/dir"
x.gsub("/","\\/")
=> "\\/foo\\/bar\\/dir"
así que hizo lo que hubiera preguntado antes. x.gsub("/","\\/")
de hecho se evalúa en "\/foo\/bar\/dir"
pero no se imprime IRB valor del método inspect
en lugar de volver to_s
.
Editar ¿Se refiere a
real_path.gsub("/","\/")
Istead de
real_path.gsub("\/","\/")
De todos modos, la salida es correcta - ¿Ha cambiado /
con \/
por lo que tiene
"sh -c 'sed '\''s/SHARE_PATH/\/home\/me\/www\/idata\/shared/g'\'' .... "`
en lugar de
`"sh -c 'sed '\''s/SHARE_PATH//home/me/www/idata/shared/g'\'' .... "`
y el resultado es diferente del resultado del IRB (aviso de la falta de barra invertida duplicado).
Para la manipulación ruta recomiendo el uso de File.join
( documentación )
Por cierto: ¿Por qué estás modificando la trayectoria de esta manera? (1)
Edit2:? ¿Por qué preguntas sobre el cambio de "/" a "/", pero escribir la siguiente línea
path = real_path.gsub("\/","\\/")
¿Qué está tratando de lograr? Y ¿cuál es su respuesta a la pregunta (1)
?
Edit3:
Aquí vamos:
>> 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
>>
pero no entiendo por qué necesita barra invertida en un camino?