Nombre de archivo DOS que se escapa para usarlo con comandos *nix
Pregunta
Quiero escapar de un nombre de archivo de DOS para poder usarlo con sed.Tengo un archivo por lotes de DOS parecido a este:
set FILENAME=%~f1
sed 's/Some Pattern/%FILENAME%/' inputfile
(Nota: %~f1
- se expande %1
a un nombre de ruta completo - C:\utils\MyFile.txt
)
Descubrí que las barras invertidas en %FILENAME%
simplemente están escapando de la siguiente letra.
¿Cómo puedo duplicarlos para que se escapen?
(Tengo instalado cygwin, así que siéntete libre de usar cualquier otro comando *nix)
Solución
Combinando las sugerencias de Jeremy y Alexandru Nedelcu, y usando | para el delimitador en el comando sed que tengo
set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
Solución
Esto funcionará.Es complicado porque en los archivos BAT no puedes usar set var=`cmd` como puedes hacerlo en Unix.El hecho de que echo no entienda las comillas también es complicado y podría generar problemas si Some Pattern
contiene metacaracteres de shell.
set FILENAME=%~f1
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
[Editado]:Me sorprende que no te haya funcionado.Lo acabo de probar y funcionó en mi máquina.Estoy usando sed de http://sourceforge.net/projects/unxutils y usar cmd.exe para ejecutar esos comandos en un archivo bat.
Otros consejos
Podrías probar como alternativa (desde el símbolo del sistema)...
> cygpath -m c:\some\path
c:/some/path
Como puedes adivinar, convierte barras invertidas en barras.
@Alexandru y Jeremy, gracias por tu ayuda.Ambos obtienen votos positivos.
@Jeremy
Usando su método recibí el siguiente error:
sed:-e expresión #1, carácter 8:comando `s' sin terminar
Si puedes editar tu respuesta para que funcione, la aceptaría.(pegar mi solución no cuenta)
Actualizar: Ok, lo probé con UnixUtils y funcionó.(Como referencia, el UnixUtils que descargué tenía fecha del 1 de marzo de 2007 y usa GNU sed versión 3.02, mi instalación de Cygwin tiene GNU sed versión 4.1.5)