Suponiendo que $file
tiene un valor de un nombre de archivo, por ejemplo Dr' A.tif
. En la programación de bash, ¿cómo podría escapar de la comilla simple y de cualquier otro carácter especial $file
sin eliminar el carácter especial?
Actualización el 9 de julio de 2014
Como solicitud de @Gilles , siguiendo el fragmento de código que no puede manejar Dr' A.tif
:
files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]")
echo "${files}" > ${TEMP_FILE}
while read file
do
newfile=$(echo "${file}" | sed 's, ,\\ ,g') ## line 1
done < ${TEMP_FILE}
Después he probado la respuesta de @Patrick en line 1
, parece que funciona para mí. Pero si tengo un archivo como Dr\^s A.tif
, el printf
comando no parece ayudar, me lo muestra Dr\^s\ A.tif
. Si lo pruebo manualmente en la consola de esta manera:
printf "%q" "Dr\^s A.tif"
Tendré esta salida:
Dr\\\^s\ A.tif
¿Alguna idea de cómo manejar esto?
Respuestas:
Puede usar el
printf
builtin con%q
para lograr esto. Por ejemplo:De la documentación de bash en
printf
:fuente
printf '%s' "foo"
. Primero debe comprender cómo funciona el análisis de argumentos en el shell. Consulte gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 ocurre antes del # 6.printf
y sin otras manipulacionesIt doesn't have a: ""
printf
. Su problema es que no desea que el shell analice su cadena. Para hacer eso, debe pasar su entrada al shell de manera que ni siquiera intente analizarlo. Una forma de hacerlo seríaread -r -p 'input: ' && printf '%q\n' "$REPLY"
y proporcionar la entrada cuando se le solicite.printf
. Quizás debería hacer una pregunta en lugar de criticar una solución que no tiene nada que ver con su problema.Tratar:-
o
o si la cadena contiene una comilla doble: -
Hay buenos tutoriales sobre cómo escapar y citar en la red. Comience con este .
fuente
No necesita escapar de ningún nombre de archivo que esté manejando en un script. Escapar solo es necesario si desea poner un nombre de archivo como literal en una secuencia de comandos, o pasar varios nombres de archivo como una secuencia de entrada única a otra secuencia de comandos.
Dado que está recorriendo la salida de
find
, esta es una de las formas más simples (!) De manejar todas las rutas posibles :fuente
rápido y (muy) sucio
fuente
Muchas de estas respuestas, incluida la más votada
printf "%q"
, no funcionarán en todos los casos sin una manipulación adicional. Sugeriría lo siguiente (ejemplo a continuación):cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn't contain lexemes: "" EOF
fuente