2012-10-09 274 views
21

Soy nuevo en el script de shell. ¿Alguien puede ayudarme con el comando para escapar del espacio con "\". Tengo un FILE_PATH variable =/ruta/a mi archivo/texto,
Quiero escapar de los espacios solos FILE_PATH =/ruta/a \ mi/texto \ archivoComando de Unix para escapar espacios

Probé con el comando -s tr pero que no ayuda

FILE_PATH = echo FILE_PATH | tr -s " " "\\ "

Puede alguien sugerir el comando derecho !!

+0

¿Cuál es el problema ** real ** que está teniendo? –

+0

Solo quiero escapar del espacio para poder usarlo en otros comandos como cp, rm, etc. – Mojoy

+5

Si desea usar FILE_PATH en otros comandos, solo use comillas. 'rm" $ FILE_PATH "' funciona bien si contiene espacios en blanco. –

Respuesta

8

Hay más de hacer una cadena segura de espacios simplemente se escapan, pero se puede escapar de los espacios con:

FILE_PATH=$(echo "$FILE_PATH" | sed 's/ /\\ /g') 
+0

¿Te importaría elaborar? Supongo que está sugiriendo la eliminación de los caracteres reservados por el shell, por ejemplo, '[]() {}; '' [: espacio:] & 'así como también caracteres no imprimibles. ¿Tiene algo más en mente? –

+0

@Barton Sin duda dependerá del uso, pero todos los caracteres que menciona son sospechosos. Mayormente lo que tengo en la mente es que intentar escapar de los personajes para cualquier tipo de protección es frágil y no algo que debería hacerse sin mucho cuidado. –

1

Puede hacerlo con sed:

NEW_FILE_PATH="$(echo $FILE_PATH | sed 's/ /\\ /g')" 
+0

'FILE_PATH = $ (echo $ FILE_PATH | sed" s// \\\/g ")' Necesita tres barras diagonales inversas porque debe escapar de la barra invertida, tanto en el shell como en sed. – sevcsik

-3
FILE_PATH=/path/to my/text file 
FILE_PATH=echo FILE_PATH | tr -s " " "\\ " 

Ese segundo la línea debe ser

FILE_PATH=echo $FILE_PATH | tr -s " " "\\ " 

pero no creo que importe. Una vez que ha llegado a esta etapa, ya es demasiado tarde. La variable se ha establecido y se escapan los espacios o la variable es incorrecta.

FILE_PATH = '/ ruta/a mi archivo/texto'

+0

'FILE_PATH = echo $ FILE_PATH | tr -s "" "\\" 'está roto. Necesitas '$()' –

+0

Lo suficientemente justo, estaba escribiendo rápidamente, pero ese no era el punto principal. – hymie

+0

Además, 'tr' no se puede usar para esto. –

30

Si está usando bash, puede utilizar% q formateador de su printf orden interna (tipo help printf en bash):

FILENAME=$(printf %q "$FILENAME") 

Esto no solo citará espacio, sino también todos los caracteres especiales para shell.

+0

Al usar esto sigo teniendo problemas con dos espacios de concatenación. ¿Que puedo hacer? –

8

puede utilizar 'comillas simples' para operar en una ruta que contiene espacios:

cp '/path/with spaces/file.txt' '/another/spacey path/dir'

grep foo '/my/super spacey/path with spaces/folder/*'

en un script:

#!/bin/bash 

spacey_dir='My Documents' 
spacey_file='Hello World.txt' 
mkdir '$spacey_dir' 
touch '${spacey_dir}/${spacey_file}' 
+2

A menos que necesite hacer una interpolación variable, sugeriría utilizar comillas simples en lugar de dobles. Hay algunos personajes furtivos como '!', Que bash intentará interpolar entre comillas dobles, pero no solo. Por supuesto, eres libre de enviar una viruela a cualquiera que ponga caracteres bang en los nombres de los archivos. –

1

Use comillas para conservar el carácter SPACE

Cuestiones relacionadas