Cómo gsub barra “/” con la barra inclinada hacia atrás y barra “\ /” en rubí

StackOverflow https://stackoverflow.com/questions/2308387

  •  22-09-2019
  •  | 
  •  

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("/",'\/') 
¿Fue útil?

Solución

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top