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
¿Fue útil?

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)

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